aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2016-10-27 23:17:31 -0400
committerGitHub <noreply@github.com>2016-10-27 23:17:31 -0400
commit57f83a2744fb5ebdf5774d51d2125ea46f4ce8ab (patch)
treef0a8c9137d24160fe8e2955bff7010163f2d4066 /MediaBrowser.Server.Implementations
parent8fcc7a0385b9db202c1f93ee897eb5a11d2759da (diff)
parentf6acc5fbff081728138564867a58b7848c92c467 (diff)
Merge pull request #2256 from MediaBrowser/dev
Dev
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Activity/ActivityManager.cs1
-rw-r--r--MediaBrowser.Server.Implementations/Activity/ActivityRepository.cs1
-rw-r--r--MediaBrowser.Server.Implementations/Channels/ChannelManager.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Collections/CollectionManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Collections/CollectionsDynamicFolder.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Connect/ConnectManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Devices/DeviceManager.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Devices/DeviceRepository.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs4
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs3
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/ExternalPortForwarding.cs58
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/LoadRegistrations.cs2
-rw-r--r--MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs4
-rw-r--r--MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs4
-rw-r--r--MediaBrowser.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs4
-rw-r--r--MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs4
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/AsyncStreamWriter.cs59
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs44
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs59
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs2
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs81
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs21
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs4
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/Security/SessionAuthProvider.cs35
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs6
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs11
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/HttpUtility.cs11
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/RequestMono.cs22
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs17
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs40
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs47
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs58
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SwaggerService.cs4
-rw-r--r--MediaBrowser.Server.Implementations/IO/FileRefresher.cs12
-rw-r--r--MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs4
-rw-r--r--MediaBrowser.Server.Implementations/IO/ThrottledStream.cs393
-rw-r--r--MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs7
-rw-r--r--MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Library/ResolverHelper.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs12
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs8
-rw-r--r--MediaBrowser.Server.Implementations/Library/UserManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Library/UserViewManager.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs4
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs5
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs8
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs5
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs4
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs6
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs4
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunLiveStream.cs4
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs4
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs4
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/SatIpHost.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs22
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj20
-rw-r--r--MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs6
-rw-r--r--MediaBrowser.Server.Implementations/News/NewsService.cs1
-rw-r--r--MediaBrowser.Server.Implementations/Notifications/CoreNotificationTypes.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs19
-rw-r--r--MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Reflection/AssemblyInfo.cs14
-rw-r--r--MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs4
-rw-r--r--MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs4
-rw-r--r--MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs3
-rw-r--r--MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs3
-rw-r--r--MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs3
-rw-r--r--MediaBrowser.Server.Implementations/Social/SharingManager.cs1
-rw-r--r--MediaBrowser.Server.Implementations/Sorting/OfficialRatingComparer.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Sync/MediaSync.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Sync/MultiProviderSync.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Sync/ServerSyncScheduledTask.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncConvertScheduledTask.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs5
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs3
-rw-r--r--MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs3
-rw-r--r--MediaBrowser.Server.Implementations/TV/SeriesPostScanTask.cs238
-rw-r--r--MediaBrowser.Server.Implementations/Threading/PeriodicTimer.cs72
-rw-r--r--MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs4
-rw-r--r--MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Xml/XmlReaderSettingsFactory.cs20
-rw-r--r--MediaBrowser.Server.Implementations/packages.config3
102 files changed, 1215 insertions, 489 deletions
diff --git a/MediaBrowser.Server.Implementations/Activity/ActivityManager.cs b/MediaBrowser.Server.Implementations/Activity/ActivityManager.cs
index 0904c92f1c..2af9395c37 100644
--- a/MediaBrowser.Server.Implementations/Activity/ActivityManager.cs
+++ b/MediaBrowser.Server.Implementations/Activity/ActivityManager.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Common.Events;
-using MediaBrowser.Controller.Activity;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Activity;
using MediaBrowser.Model.Events;
diff --git a/MediaBrowser.Server.Implementations/Activity/ActivityRepository.cs b/MediaBrowser.Server.Implementations/Activity/ActivityRepository.cs
index c992def39d..f3c52088be 100644
--- a/MediaBrowser.Server.Implementations/Activity/ActivityRepository.cs
+++ b/MediaBrowser.Server.Implementations/Activity/ActivityRepository.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Controller;
-using MediaBrowser.Controller.Activity;
using MediaBrowser.Model.Activity;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Querying;
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
index 1369efae1b..ffb9c96e7a 100644
--- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
+++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
@@ -24,10 +23,13 @@ using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.Globalization;
namespace MediaBrowser.Server.Implementations.Channels
{
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs b/MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs
index 1ab36c0046..d70d4b9e65 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs
@@ -10,7 +10,9 @@ using MediaBrowser.Server.Implementations.Photos;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Extensions;
namespace MediaBrowser.Server.Implementations.Collections
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
index cb2bd645dd..f074fd812c 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
@@ -11,7 +11,9 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Collections
{
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionsDynamicFolder.cs b/MediaBrowser.Server.Implementations/Collections/CollectionsDynamicFolder.cs
index 50bb6c5592..2d0c3642ea 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionsDynamicFolder.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionsDynamicFolder.cs
@@ -1,8 +1,10 @@
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities;
using System.IO;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Collections;
+using MediaBrowser.Controller.IO;
namespace MediaBrowser.Server.Implementations.Collections
{
diff --git a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
index e8669bbc2c..f48b796742 100644
--- a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
+++ b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
@@ -15,7 +15,9 @@ using MediaBrowser.Model.Serialization;
using System;
using System.IO;
using System.Linq;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Configuration
{
diff --git a/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs b/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs
index 2562c0d717..769b7821ab 100644
--- a/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs
+++ b/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs
@@ -11,8 +11,10 @@ using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
-using CommonIO;
-using MediaBrowser.Controller.Threading;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Server.Implementations.Threading;
namespace MediaBrowser.Server.Implementations.Connect
{
diff --git a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs b/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs
index d7c1b0da07..27bbfbe82d 100644
--- a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs
+++ b/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs
@@ -23,8 +23,10 @@ using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
namespace MediaBrowser.Server.Implementations.Connect
{
diff --git a/MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs b/MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs
index 3dfc04c267..19a0593e3b 100644
--- a/MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs
+++ b/MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs
@@ -6,7 +6,9 @@ using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Providers;
namespace MediaBrowser.Server.Implementations.Devices
diff --git a/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs b/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
index c3db9140cf..e2e59df088 100644
--- a/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
+++ b/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
@@ -16,8 +16,10 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.IO;
namespace MediaBrowser.Server.Implementations.Devices
{
@@ -167,7 +169,7 @@ namespace MediaBrowser.Server.Implementations.Devices
try
{
- using (var fs = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
+ using (var fs = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
{
await stream.CopyToAsync(fs).ConfigureAwait(false);
}
diff --git a/MediaBrowser.Server.Implementations/Devices/DeviceRepository.cs b/MediaBrowser.Server.Implementations/Devices/DeviceRepository.cs
index 6e67af82b4..05e3b68f19 100644
--- a/MediaBrowser.Server.Implementations/Devices/DeviceRepository.cs
+++ b/MediaBrowser.Server.Implementations/Devices/DeviceRepository.cs
@@ -10,7 +10,9 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Devices
{
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index d071558c3a..a06656b211 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -24,7 +24,9 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Extensions;
namespace MediaBrowser.Server.Implementations.Dto
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs
index 6e4451d96a..de0719a622 100644
--- a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs
+++ b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs
@@ -4,11 +4,9 @@ using MediaBrowser.Common.Plugins;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Common.Updates;
using MediaBrowser.Controller;
-using MediaBrowser.Controller.Activity;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Plugins;
using MediaBrowser.Controller.Session;
using MediaBrowser.Controller.Subtitles;
@@ -21,6 +19,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using MediaBrowser.Model.Globalization;
namespace MediaBrowser.Server.Implementations.EntryPoints
{
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ExternalPortForwarding.cs b/MediaBrowser.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
index fb5bdb790a..9db49f97ae 100644
--- a/MediaBrowser.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
+++ b/MediaBrowser.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
@@ -8,8 +8,9 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.Net;
-using MediaBrowser.Controller.Threading;
+using MediaBrowser.Common.Net;
using MediaBrowser.Model.Events;
+using MediaBrowser.Server.Implementations.Threading;
namespace MediaBrowser.Server.Implementations.EntryPoints
{
@@ -17,18 +18,20 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
{
private readonly IServerApplicationHost _appHost;
private readonly ILogger _logger;
+ private readonly IHttpClient _httpClient;
private readonly IServerConfigurationManager _config;
private readonly IDeviceDiscovery _deviceDiscovery;
private PeriodicTimer _timer;
private bool _isStarted;
- public ExternalPortForwarding(ILogManager logmanager, IServerApplicationHost appHost, IServerConfigurationManager config, IDeviceDiscovery deviceDiscovery)
+ public ExternalPortForwarding(ILogManager logmanager, IServerApplicationHost appHost, IServerConfigurationManager config, IDeviceDiscovery deviceDiscovery, IHttpClient httpClient)
{
_logger = logmanager.GetLogger("PortMapper");
_appHost = appHost;
_config = config;
_deviceDiscovery = deviceDiscovery;
+ _httpClient = httpClient;
}
private string _lastConfigIdentifier;
@@ -63,6 +66,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
public void Run()
{
NatUtility.Logger = _logger;
+ NatUtility.HttpClient = _httpClient;
if (_config.Configuration.EnableUPnP)
{
@@ -87,9 +91,6 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
NatUtility.DeviceLost += NatUtility_DeviceLost;
- // it is hard to say what one should do when an unhandled exception is raised
- // because there isn't anything one can do about it. Probably save a log or ignored it.
- NatUtility.UnhandledException += NatUtility_UnhandledException;
NatUtility.StartDiscovery();
_timer = new PeriodicTimer(ClearCreatedRules, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
@@ -136,7 +137,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
_usnsHandled.Add(identifier);
}
- _logger.Debug("Calling Nat.Handle on " + identifier);
+ _logger.Debug("Found NAT device: " + identifier);
IPAddress address;
if (IPAddress.TryParse(info.Location.Host, out address))
@@ -150,16 +151,23 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
{
var localAddressString = await _appHost.GetLocalApiUrl().ConfigureAwait(false);
- if (!IPAddress.TryParse(localAddressString, out localAddress))
+ Uri uri;
+ if (Uri.TryCreate(localAddressString, UriKind.Absolute, out uri))
{
- return;
+ localAddressString = uri.Host;
+
+ if (!IPAddress.TryParse(localAddressString, out localAddress))
+ {
+ return;
+ }
}
}
- catch
+ catch (Exception ex)
{
return;
}
+ _logger.Debug("Calling Nat.Handle on " + identifier);
NatUtility.Handle(localAddress, info, endpoint, NatProtocol.Upnp);
}
}
@@ -173,21 +181,6 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
}
}
- void NatUtility_UnhandledException(object sender, UnhandledExceptionEventArgs e)
- {
- var ex = e.ExceptionObject as Exception;
-
- if (ex == null)
- {
- //_logger.Error("Unidentified error reported by Mono.Nat");
- }
- else
- {
- // Seeing some blank exceptions coming through here
- //_logger.ErrorException("Error reported by Mono.Nat: ", ex);
- }
- }
-
void NatUtility_DeviceFound(object sender, DeviceEventArgs e)
{
try
@@ -229,13 +222,21 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
}
}
- private void CreatePortMap(INatDevice device, int privatePort, int publicPort)
+ private async void CreatePortMap(INatDevice device, int privatePort, int publicPort)
{
_logger.Debug("Creating port map on port {0}", privatePort);
- device.CreatePortMap(new Mapping(Protocol.Tcp, privatePort, publicPort)
+
+ try
+ {
+ await device.CreatePortMap(new Mapping(Protocol.Tcp, privatePort, publicPort)
+ {
+ Description = _appHost.Name
+ }).ConfigureAwait(false);
+ }
+ catch (Exception ex)
{
- Description = _appHost.Name
- });
+ _logger.ErrorException("Error creating port map", ex);
+ }
}
// As I said before, this method will be never invoked. You can remove it.
@@ -268,7 +269,6 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
NatUtility.StopDiscovery();
NatUtility.DeviceFound -= NatUtility_DeviceFound;
NatUtility.DeviceLost -= NatUtility_DeviceLost;
- NatUtility.UnhandledException -= NatUtility_UnhandledException;
}
// Statements in try-block will no fail because StopDiscovery is a one-line
// method that was no chances to fail.
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/LoadRegistrations.cs b/MediaBrowser.Server.Implementations/EntryPoints/LoadRegistrations.cs
index 38bf89c62d..47f22cae6b 100644
--- a/MediaBrowser.Server.Implementations/EntryPoints/LoadRegistrations.cs
+++ b/MediaBrowser.Server.Implementations/EntryPoints/LoadRegistrations.cs
@@ -3,7 +3,7 @@ using MediaBrowser.Controller.Plugins;
using MediaBrowser.Model.Logging;
using System;
using System.Threading.Tasks;
-using MediaBrowser.Controller.Threading;
+using MediaBrowser.Server.Implementations.Threading;
namespace MediaBrowser.Server.Implementations.EntryPoints
{
diff --git a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
index 5e01666a9a..19592bc4e5 100644
--- a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
+++ b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
@@ -16,7 +16,9 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.FileOrganization
{
diff --git a/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs b/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs
index 9aa49946d8..63cc1dc68a 100644
--- a/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs
+++ b/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs
@@ -14,10 +14,12 @@ using System.Collections.Concurrent;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Events;
using MediaBrowser.Common.Events;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Tasks;
namespace MediaBrowser.Server.Implementations.FileOrganization
diff --git a/MediaBrowser.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs b/MediaBrowser.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs
index 2cc8d0ea54..8b876904f8 100644
--- a/MediaBrowser.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs
+++ b/MediaBrowser.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs
@@ -9,7 +9,9 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Tasks;
namespace MediaBrowser.Server.Implementations.FileOrganization
diff --git a/MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs
index 4f42d8a20d..d83aee25b1 100644
--- a/MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs
+++ b/MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs
@@ -10,7 +10,9 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.FileOrganization
{
diff --git a/MediaBrowser.Server.Implementations/HttpServer/AsyncStreamWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/AsyncStreamWriter.cs
deleted file mode 100644
index e44b0c6af1..0000000000
--- a/MediaBrowser.Server.Implementations/HttpServer/AsyncStreamWriter.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading.Tasks;
-using ServiceStack;
-using ServiceStack.Web;
-using MediaBrowser.Controller.Net;
-
-namespace MediaBrowser.Server.Implementations.HttpServer
-{
- public class AsyncStreamWriter : IStreamWriter, IAsyncStreamWriter, IHasOptions
- {
- /// <summary>
- /// Gets or sets the source stream.
- /// </summary>
- /// <value>The source stream.</value>
- private IAsyncStreamSource _source;
-
- public Action OnComplete { get; set; }
- public Action OnError { get; set; }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="AsyncStreamWriter" /> class.
- /// </summary>
- public AsyncStreamWriter(IAsyncStreamSource source)
- {
- _source = source;
- }
-
- public IDictionary<string, string> Options
- {
- get
- {
- var hasOptions = _source as IHasOptions;
- if (hasOptions != null)
- {
- return hasOptions.Options;
- }
-
- return new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
- }
- }
-
- /// <summary>
- /// Writes to.
- /// </summary>
- /// <param name="responseStream">The response stream.</param>
- public void WriteTo(Stream responseStream)
- {
- var task = _source.WriteToAsync(responseStream);
- Task.WaitAll(task);
- }
-
- public async Task WriteToAsync(Stream responseStream)
- {
- await _source.WriteToAsync(responseStream).ConfigureAwait(false);
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
index 21522a9dab..71704f8e29 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
@@ -6,10 +6,8 @@ using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Implementations.HttpServer.SocketSharp;
using ServiceStack;
-using ServiceStack.Api.Swagger;
using ServiceStack.Host;
using ServiceStack.Host.Handlers;
-using ServiceStack.Host.HttpListener;
using ServiceStack.Logging;
using ServiceStack.Web;
using System;
@@ -19,11 +17,13 @@ using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Security;
+using MediaBrowser.Controller;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Services;
+using ServiceStack.Api.Swagger;
namespace MediaBrowser.Server.Implementations.HttpServer
{
@@ -34,7 +34,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
private readonly ILogger _logger;
public IEnumerable<string> UrlPrefixes { get; private set; }
- private readonly List<IRestfulService> _restServices = new List<IRestfulService>();
+ private readonly List<IService> _restServices = new List<IService>();
private IHttpListener _listener;
@@ -49,13 +49,16 @@ namespace MediaBrowser.Server.Implementations.HttpServer
private readonly INetworkManager _networkManager;
private readonly IMemoryStreamProvider _memoryStreamProvider;
- public HttpListenerHost(IApplicationHost applicationHost,
+ private readonly IServerApplicationHost _appHost;
+
+ public HttpListenerHost(IServerApplicationHost applicationHost,
ILogManager logManager,
IServerConfigurationManager config,
string serviceName,
string defaultRedirectPath, INetworkManager networkManager, IMemoryStreamProvider memoryStreamProvider, params Assembly[] assembliesWithServices)
: base(serviceName, assembliesWithServices)
{
+ _appHost = applicationHost;
DefaultRedirectPath = defaultRedirectPath;
_networkManager = networkManager;
_memoryStreamProvider = memoryStreamProvider;
@@ -100,7 +103,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer
container.Adapter = _containerAdapter;
- Plugins.RemoveAll(x => x is NativeTypesFeature);
Plugins.Add(new SwaggerFeature());
Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization, Range, X-MediaBrowser-Token, X-Emby-Authorization"));
@@ -117,6 +119,12 @@ namespace MediaBrowser.Server.Implementations.HttpServer
// }
//});
+ var requestFilters = _appHost.GetExports<IRequestFilter>().ToList();
+ foreach (var filter in requestFilters)
+ {
+ HostContext.GlobalRequestFilters.Add(filter.Filter);
+ }
+
HostContext.GlobalResponseFilters.Add(new ResponseFilter(_logger).FilterResponse);
}
@@ -171,7 +179,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// </summary>
private void StartListener()
{
- HostContext.Config.HandlerFactoryPath = ListenerRequest.GetHandlerPathIfAny(UrlPrefixes.First());
+ HostContext.Config.HandlerFactoryPath = GetHandlerPathIfAny(UrlPrefixes.First());
_listener = GetListener();
@@ -183,6 +191,18 @@ namespace MediaBrowser.Server.Implementations.HttpServer
_listener.Start(UrlPrefixes);
}
+ public static string GetHandlerPathIfAny(string listenerUrl)
+ {
+ if (listenerUrl == null) return null;
+ var pos = listenerUrl.IndexOf("://", StringComparison.OrdinalIgnoreCase);
+ if (pos == -1) return null;
+ var startHostUrl = listenerUrl.Substring(pos + "://".Length);
+ var endPos = startHostUrl.IndexOf('/');
+ if (endPos == -1) return null;
+ var endHostUrl = startHostUrl.Substring(endPos + 1);
+ return string.IsNullOrEmpty(endHostUrl) ? null : endHostUrl.TrimEnd('/');
+ }
+
private IHttpListener GetListener()
{
return new WebSocketSharpListener(_logger, CertificatePath, _memoryStreamProvider);
@@ -558,7 +578,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// Adds the rest handlers.
/// </summary>
/// <param name="services">The services.</param>
- public void Init(IEnumerable<IRestfulService> services)
+ public void Init(IEnumerable<IService> services)
{
_restServices.AddRange(services);
@@ -569,28 +589,28 @@ namespace MediaBrowser.Server.Implementations.HttpServer
base.Init();
}
- public override RouteAttribute[] GetRouteAttributes(Type requestType)
+ public override Model.Services.RouteAttribute[] GetRouteAttributes(Type requestType)
{
var routes = base.GetRouteAttributes(requestType).ToList();
var clone = routes.ToList();
foreach (var route in clone)
{
- routes.Add(new RouteAttribute(NormalizeEmbyRoutePath(route.Path), route.Verbs)
+ routes.Add(new Model.Services.RouteAttribute(NormalizeEmbyRoutePath(route.Path), route.Verbs)
{
Notes = route.Notes,
Priority = route.Priority,
Summary = route.Summary
});
- routes.Add(new RouteAttribute(NormalizeRoutePath(route.Path), route.Verbs)
+ routes.Add(new Model.Services.RouteAttribute(NormalizeRoutePath(route.Path), route.Verbs)
{
Notes = route.Notes,
Priority = route.Priority,
Summary = route.Summary
});
- routes.Add(new RouteAttribute(DoubleNormalizeEmbyRoutePath(route.Path), route.Verbs)
+ routes.Add(new Model.Services.RouteAttribute(DoubleNormalizeEmbyRoutePath(route.Path), route.Verbs)
{
Notes = route.Notes,
Priority = route.Priority,
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs
index 10d6f74938..de41481cc0 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs
@@ -2,8 +2,6 @@
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
-using ServiceStack;
-using ServiceStack.Web;
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -11,7 +9,13 @@ using System.IO;
using System.Net;
using System.Text;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Services;
+using ServiceStack;
+using ServiceStack.Web;
+using IRequest = MediaBrowser.Model.Services.IRequest;
using MimeTypes = MediaBrowser.Model.Net.MimeTypes;
namespace MediaBrowser.Server.Implementations.HttpServer
@@ -59,10 +63,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// <param name="content">The content.</param>
/// <param name="contentType">Type of the content.</param>
/// <param name="responseHeaders">The response headers.</param>
- /// <returns>IHasOptions.</returns>
- private IHasOptions GetHttpResult(object content, string contentType, IDictionary<string, string> responseHeaders = null)
+ /// <returns>IHasHeaders.</returns>
+ private IHasHeaders GetHttpResult(object content, string contentType, IDictionary<string, string> responseHeaders = null)
{
- IHasOptions result;
+ IHasHeaders result;
var stream = content as Stream;
@@ -140,11 +144,11 @@ namespace MediaBrowser.Server.Implementations.HttpServer
}
// Apply headers
- var hasOptions = optimizedResult as IHasOptions;
+ var hasHeaders = optimizedResult as IHasHeaders;
- if (hasOptions != null)
+ if (hasHeaders != null)
{
- AddResponseHeaders(hasOptions, responseHeaders);
+ AddResponseHeaders(hasHeaders, responseHeaders);
}
return optimizedResult;
@@ -237,15 +241,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer
result = factoryFn();
// Apply caching headers
- var hasOptions = result as IHasOptions;
+ var hasHeaders = result as IHasHeaders;
- if (hasOptions != null)
+ if (hasHeaders != null)
{
- AddResponseHeaders(hasOptions, responseHeaders);
- return hasOptions;
+ AddResponseHeaders(hasHeaders, responseHeaders);
+ return hasHeaders;
}
- IHasOptions httpResult;
+ IHasHeaders httpResult;
var stream = result as Stream;
@@ -298,7 +302,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
public Task<object> GetStaticFileResult(IRequest requestContext,
string path,
- FileShare fileShare = FileShare.Read)
+ FileShareMode fileShare = FileShareMode.Read)
{
if (string.IsNullOrEmpty(path))
{
@@ -323,7 +327,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
throw new ArgumentNullException("path");
}
- if (fileShare != FileShare.Read && fileShare != FileShare.ReadWrite)
+ if (fileShare != FileShareMode.Read && fileShare != FileShareMode.ReadWrite)
{
throw new ArgumentException("FileShare must be either Read or ReadWrite");
}
@@ -352,9 +356,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// <param name="path">The path.</param>
/// <param name="fileShare">The file share.</param>
/// <returns>Stream.</returns>
- private Stream GetFileStream(string path, FileShare fileShare)
+ private Stream GetFileStream(string path, FileShareMode fileShare)
{
- return _fileSystem.GetFileStream(path, FileMode.Open, FileAccess.Read, fileShare);
+ return _fileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, fileShare);
}
public Task<object> GetStaticResult(IRequest requestContext,
@@ -404,10 +408,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer
}
var compress = ShouldCompressResponse(requestContext, contentType);
- var hasOptions = await GetStaticResult(requestContext, options, compress).ConfigureAwait(false);
- AddResponseHeaders(hasOptions, options.ResponseHeaders);
+ var hasHeaders = await GetStaticResult(requestContext, options, compress).ConfigureAwait(false);
+ AddResponseHeaders(hasHeaders, options.ResponseHeaders);
- return hasOptions;
+ return hasHeaders;
}
/// <summary>
@@ -461,7 +465,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// </summary>
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
- private async Task<IHasOptions> GetStaticResult(IRequest requestContext, StaticResultOptions options, bool compress)
+ private async Task<IHasHeaders> GetStaticResult(IRequest requestContext, StaticResultOptions options, bool compress)
{
var isHeadRequest = options.IsHeadRequest;
var factoryFn = options.ContentFactory;
@@ -673,19 +677,14 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// <summary>
/// Adds the response headers.
/// </summary>
- /// <param name="hasOptions">The has options.</param>
+ /// <param name="hasHeaders">The has options.</param>
/// <param name="responseHeaders">The response headers.</param>
- private void AddResponseHeaders(IHasOptions hasOptions, IEnumerable<KeyValuePair<string, string>> responseHeaders)
+ private void AddResponseHeaders(IHasHeaders hasHeaders, IEnumerable<KeyValuePair<string, string>> responseHeaders)
{
foreach (var item in responseHeaders)
{
- hasOptions.Options[item.Key] = item.Value;
+ hasHeaders.Headers[item.Key] = item.Value;
}
}
-
- public object GetAsyncStreamWriter(IAsyncStreamSource streamSource)
- {
- return new AsyncStreamWriter(streamSource);
- }
}
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs
index dc315601f2..7db935d43c 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs
@@ -1,8 +1,8 @@
using MediaBrowser.Controller.Net;
-using ServiceStack.Web;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.HttpServer
{
diff --git a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs
index 4b94095f52..7d4cd3b4dc 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs
@@ -5,12 +5,13 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Net;
+using System.Threading;
using System.Threading.Tasks;
-using ServiceStack;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.HttpServer
{
- public class RangeRequestWriter : IStreamWriter, IAsyncStreamWriter, IHttpResult
+ public class RangeRequestWriter : IAsyncStreamWriter, IHttpResult
{
/// <summary>
/// Gets or sets the source stream.
@@ -47,21 +48,12 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// Additional HTTP Headers
/// </summary>
/// <value>The headers.</value>
- public Dictionary<string, string> Headers
+ public IDictionary<string, string> Headers
{
get { return _options; }
}
/// <summary>
- /// Gets the options.
- /// </summary>
- /// <value>The options.</value>
- public IDictionary<string, string> Options
- {
- get { return Headers; }
- }
-
- /// <summary>
/// Initializes a new instance of the <see cref="StreamWriter" /> class.
/// </summary>
/// <param name="rangeHeader">The range header.</param>
@@ -81,8 +73,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
this._logger = logger;
ContentType = contentType;
- Options["Content-Type"] = contentType;
- Options["Accept-Ranges"] = "bytes";
+ Headers["Content-Type"] = contentType;
+ Headers["Accept-Ranges"] = "bytes";
StatusCode = HttpStatusCode.PartialContent;
Cookies = new List<Cookie>();
@@ -112,8 +104,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
RangeLength = 1 + RangeEnd - RangeStart;
// Content-Length is the length of what we're serving, not the original content
- Options["Content-Length"] = RangeLength.ToString(UsCulture);
- Options["Content-Range"] = string.Format("bytes {0}-{1}/{2}", RangeStart, RangeEnd, TotalContentLength);
+ Headers["Content-Length"] = RangeLength.ToString(UsCulture);
+ Headers["Content-Range"] = string.Format("bytes {0}-{1}/{2}", RangeStart, RangeEnd, TotalContentLength);
if (RangeStart > 0)
{
@@ -164,62 +156,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
}
}
- /// <summary>
- /// Writes to.
- /// </summary>
- /// <param name="responseStream">The response stream.</param>
- public void WriteTo(Stream responseStream)
- {
- try
- {
- // Headers only
- if (IsHeadRequest)
- {
- return;
- }
-
- using (var source = SourceStream)
- {
- // If the requested range is "0-", we can optimize by just doing a stream copy
- if (RangeEnd >= TotalContentLength - 1)
- {
- source.CopyTo(responseStream, BufferSize);
- }
- else
- {
- CopyToInternal(source, responseStream, RangeLength);
- }
- }
- }
- finally
- {
- if (OnComplete != null)
- {
- OnComplete();
- }
- }
- }
-
- private void CopyToInternal(Stream source, Stream destination, long copyLength)
- {
- var array = new byte[BufferSize];
- int count;
- while ((count = source.Read(array, 0, array.Length)) != 0)
- {
- var bytesToCopy = Math.Min(count, copyLength);
-
- destination.Write(array, 0, Convert.ToInt32(bytesToCopy));
-
- copyLength -= bytesToCopy;
-
- if (copyLength <= 0)
- {
- break;
- }
- }
- }
-
- public async Task WriteToAsync(Stream responseStream)
+ public async Task WriteToAsync(Stream responseStream, CancellationToken cancellationToken)
{
try
{
diff --git a/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs b/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs
index ee05702f4c..f5a11ae1f0 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs
@@ -5,6 +5,7 @@ using System;
using System.Globalization;
using System.Net;
using System.Text;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.HttpServer
{
@@ -46,21 +47,21 @@ namespace MediaBrowser.Server.Implementations.HttpServer
var vary = "Accept-Encoding";
- var hasOptions = dto as IHasOptions;
+ var hasHeaders = dto as IHasHeaders;
var sharpResponse = res as WebSocketSharpResponse;
- if (hasOptions != null)
+ if (hasHeaders != null)
{
- if (!hasOptions.Options.ContainsKey("Server"))
+ if (!hasHeaders.Headers.ContainsKey("Server"))
{
- hasOptions.Options["Server"] = "Mono-HTTPAPI/1.1, UPnP/1.0 DLNADOC/1.50";
- //hasOptions.Options["Server"] = "Mono-HTTPAPI/1.1";
+ hasHeaders.Headers["Server"] = "Mono-HTTPAPI/1.1, UPnP/1.0 DLNADOC/1.50";
+ //hasHeaders.Headers["Server"] = "Mono-HTTPAPI/1.1";
}
// Content length has to be explicitly set on on HttpListenerResponse or it won't be happy
string contentLength;
- if (hasOptions.Options.TryGetValue("Content-Length", out contentLength) && !string.IsNullOrEmpty(contentLength))
+ if (hasHeaders.Headers.TryGetValue("Content-Length", out contentLength) && !string.IsNullOrEmpty(contentLength))
{
var length = long.Parse(contentLength, UsCulture);
@@ -85,13 +86,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer
}
}
- string hasOptionsVary;
- if (hasOptions.Options.TryGetValue("Vary", out hasOptionsVary))
+ string hasHeadersVary;
+ if (hasHeaders.Headers.TryGetValue("Vary", out hasHeadersVary))
{
- vary = hasOptionsVary;
+ vary = hasHeadersVary;
}
- hasOptions.Options["Vary"] = vary;
+ hasHeaders.Headers["Vary"] = vary;
}
//res.KeepAlive = false;
diff --git a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs
index bc3e7b163b..edbb5e5125 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs
@@ -1,10 +1,10 @@
using MediaBrowser.Controller.Connect;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Security;
-using ServiceStack.Web;
using System;
using System.Collections.Generic;
using System.Linq;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.HttpServer.Security
{
@@ -21,7 +21,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
public AuthorizationInfo GetAuthorizationInfo(object requestContext)
{
- var req = new ServiceStackServiceRequest((IRequest)requestContext);
+ var req = new ServiceRequest((IRequest)requestContext);
return GetAuthorizationInfo(req);
}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/Security/SessionAuthProvider.cs b/MediaBrowser.Server.Implementations/HttpServer/Security/SessionAuthProvider.cs
deleted file mode 100644
index 7c31731012..0000000000
--- a/MediaBrowser.Server.Implementations/HttpServer/Security/SessionAuthProvider.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using MediaBrowser.Controller.Net;
-using ServiceStack;
-using ServiceStack.Auth;
-
-namespace MediaBrowser.Server.Implementations.HttpServer.Security
-{
- public class SessionAuthProvider : CredentialsAuthProvider
- {
- private readonly ISessionContext _sessionContext;
-
- public SessionAuthProvider(ISessionContext sessionContext)
- {
- _sessionContext = sessionContext;
- }
-
- public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
- {
- return true;
- }
-
- public override bool IsAuthorized(IAuthSession session, IAuthTokens tokens, Authenticate request = null)
- {
- return true;
- }
-
- protected override void SaveUserAuth(IServiceBase authService, IAuthSession session, IAuthRepository authRepo, IAuthTokens tokens)
- {
- }
-
- public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
- {
- return base.Authenticate(authService, session, request);
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs b/MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs
index a498d32fac..f51ca55a8c 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs
@@ -3,8 +3,8 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Security;
using MediaBrowser.Controller.Session;
-using ServiceStack.Web;
using System.Threading.Tasks;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.HttpServer.Security
{
@@ -47,7 +47,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
public Task<SessionInfo> GetSession(object requestContext)
{
- var req = new ServiceStackServiceRequest((IRequest)requestContext);
+ var req = new ServiceRequest((IRequest)requestContext);
return GetSession(req);
}
@@ -60,7 +60,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
public Task<User> GetUser(object requestContext)
{
- var req = new ServiceStackServiceRequest((IRequest)requestContext);
+ var req = new ServiceRequest((IRequest)requestContext);
return GetUser(req);
}
}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs b/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs
index b2cbf2387e..4dff2d5a3c 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs
@@ -1,6 +1,5 @@
-using MediaBrowser.Common;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.IO;
@@ -18,17 +17,17 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// Creates the server.
/// </summary>
/// <returns>IHttpServer.</returns>
- public static IHttpServer CreateServer(IApplicationHost applicationHost,
+ public static IHttpServer CreateServer(IServerApplicationHost applicationHost,
ILogManager logManager,
IServerConfigurationManager config,
- INetworkManager _networkmanager,
+ INetworkManager networkmanager,
IMemoryStreamProvider streamProvider,
string serverName,
string defaultRedirectpath)
{
LogManager.LogFactory = new ServerLogFactory(logManager);
- return new HttpListenerHost(applicationHost, logManager, config, serverName, defaultRedirectpath, _networkmanager, streamProvider);
+ return new HttpListenerHost(applicationHost, logManager, config, serverName, defaultRedirectpath, networkmanager, streamProvider);
}
}
}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/HttpUtility.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/HttpUtility.cs
index 3ef48d13a0..49d6bceb47 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/HttpUtility.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/HttpUtility.cs
@@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
{
@@ -857,28 +858,28 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
return output.ToString();
}
- public static NameValueCollection ParseQueryString(string query)
+ public static QueryParamCollection ParseQueryString(string query)
{
return ParseQueryString(query, Encoding.UTF8);
}
- public static NameValueCollection ParseQueryString(string query, Encoding encoding)
+ public static QueryParamCollection ParseQueryString(string query, Encoding encoding)
{
if (query == null)
throw new ArgumentNullException("query");
if (encoding == null)
throw new ArgumentNullException("encoding");
if (query.Length == 0 || (query.Length == 1 && query[0] == '?'))
- return new NameValueCollection();
+ return new QueryParamCollection();
if (query[0] == '?')
query = query.Substring(1);
- NameValueCollection result = new HttpQSCollection();
+ QueryParamCollection result = new QueryParamCollection();
ParseQueryString(query, encoding, result);
return result;
}
- internal static void ParseQueryString(string query, Encoding encoding, NameValueCollection result)
+ internal static void ParseQueryString(string query, Encoding encoding, QueryParamCollection result)
{
if (query.Length == 0)
return;
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/RequestMono.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/RequestMono.cs
index d20dd7ec08..13ae48cff3 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/RequestMono.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/RequestMono.cs
@@ -5,8 +5,8 @@ using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Web;
+using MediaBrowser.Model.Services;
using ServiceStack;
-using ServiceStack.Web;
namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
{
@@ -83,7 +83,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
}
}
- public NameValueCollection Form
+ public QueryParamCollection Form
{
get
{
@@ -155,14 +155,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
throw new HttpRequestValidationException(msg);
}
- static void ValidateNameValueCollection(string name, NameValueCollection coll)
+ static void ValidateNameValueCollection(string name, QueryParamCollection coll)
{
if (coll == null)
return;
- foreach (string key in coll.Keys)
+ foreach (var pair in coll)
{
- string val = coll[key];
+ var key = pair.Name;
+ var val = pair.Value;
if (val != null && val.Length > 0 && IsInvalidString(val))
ThrowValidationException(name, key, val);
}
@@ -348,7 +349,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
}
}
}
- class WebROCollection : NameValueCollection
+ class WebROCollection : QueryParamCollection
{
bool got_id;
int id;
@@ -369,28 +370,29 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
}
public void Protect()
{
- IsReadOnly = true;
+ //IsReadOnly = true;
}
public void Unprotect()
{
- IsReadOnly = false;
+ //IsReadOnly = false;
}
public override string ToString()
{
StringBuilder result = new StringBuilder();
- foreach (string key in AllKeys)
+ foreach (var pair in this)
{
if (result.Length > 0)
result.Append('&');
+ var key = pair.Name;
if (key != null && key.Length > 0)
{
result.Append(key);
result.Append('=');
}
- result.Append(Get(key));
+ result.Append(pair.Value);
}
return result.ToString();
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
index 5509eb6271..37bd00602d 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
@@ -2,8 +2,6 @@
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Implementations.Logging;
-using ServiceStack;
-using ServiceStack.Web;
using SocketHttpListener.Net;
using System;
using System.Collections.Generic;
@@ -11,6 +9,8 @@ using System.Linq;
using System.Threading.Tasks;
using MediaBrowser.Common.IO;
using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Services;
+using ServiceStack;
namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
{
@@ -102,12 +102,19 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
{
var endpoint = ctx.Request.RemoteEndPoint.ToString();
var url = ctx.Request.RawUrl;
- var queryString = new NameValueCollection(ctx.Request.QueryString ?? new NameValueCollection());
+ var queryString = ctx.Request.QueryString ?? new NameValueCollection();
+
+ var queryParamCollection = new QueryParamCollection();
+
+ foreach (var key in queryString.AllKeys)
+ {
+ queryParamCollection[key] = queryString[key];
+ }
var connectingArgs = new WebSocketConnectingEventArgs
{
Url = url,
- QueryString = queryString,
+ QueryString = queryParamCollection,
Endpoint = endpoint
};
@@ -127,7 +134,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
WebSocketConnected(new WebSocketConnectEventArgs
{
Url = url,
- QueryString = queryString,
+ QueryString = queryParamCollection,
WebSocket = new SharpWebSocket(webSocketContext.WebSocket, _logger),
Endpoint = endpoint
});
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs
index 59e0b2a9b2..2546519f4e 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs
@@ -1,15 +1,21 @@
using System;
using System.Collections.Generic;
+using System.Collections.Specialized;
using System.IO;
using System.Text;
using Funq;
using MediaBrowser.Common.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Services;
using ServiceStack;
using ServiceStack.Host;
using ServiceStack.Web;
using SocketHttpListener.Net;
+using IHttpFile = MediaBrowser.Model.Services.IHttpFile;
+using IHttpRequest = MediaBrowser.Model.Services.IHttpRequest;
+using IHttpResponse = MediaBrowser.Model.Services.IHttpResponse;
+using IResponse = MediaBrowser.Model.Services.IResponse;
namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
{
@@ -27,8 +33,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
_memoryStreamProvider = memoryStreamProvider;
this.request = httpContext.Request;
this.response = new WebSocketSharpResponse(logger, httpContext.Response, this);
-
- this.RequestPreferences = new RequestPreferences(this);
}
public HttpListenerRequest HttpRequest
@@ -53,8 +57,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
public RequestAttributes RequestAttributes { get; set; }
- public IRequestPreferences RequestPreferences { get; private set; }
-
public T TryResolve<T>()
{
if (typeof(T) == typeof(IHttpRequest))
@@ -324,22 +326,34 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
get { return request.UserAgent; }
}
- private NameValueCollectionWrapper headers;
- public INameValueCollection Headers
+ private QueryParamCollection headers;
+ public QueryParamCollection Headers
+ {
+ get { return headers ?? (headers = ToQueryParams(request.Headers)); }
+ }
+
+ private QueryParamCollection queryString;
+ public QueryParamCollection QueryString
{
- get { return headers ?? (headers = new NameValueCollectionWrapper(request.Headers)); }
+ get { return queryString ?? (queryString = MyHttpUtility.ParseQueryString(request.Url.Query)); }
}
- private NameValueCollectionWrapper queryString;
- public INameValueCollection QueryString
+ private QueryParamCollection formData;
+ public QueryParamCollection FormData
{
- get { return queryString ?? (queryString = new NameValueCollectionWrapper(MyHttpUtility.ParseQueryString(request.Url.Query))); }
+ get { return formData ?? (formData = this.Form); }
}
- private NameValueCollectionWrapper formData;
- public INameValueCollection FormData
+ private QueryParamCollection ToQueryParams(NameValueCollection collection)
{
- get { return formData ?? (formData = new NameValueCollectionWrapper(this.Form)); }
+ var result = new QueryParamCollection();
+
+ foreach (var key in collection.AllKeys)
+ {
+ result[key] = collection[key];
+ }
+
+ return result;
}
public bool IsLocal
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs
index a58645ec54..3aae6c9ca6 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs
@@ -5,20 +5,21 @@ using System.Net;
using MediaBrowser.Model.Logging;
using ServiceStack;
using ServiceStack.Host;
-using ServiceStack.Web;
using HttpListenerResponse = SocketHttpListener.Net.HttpListenerResponse;
+using IHttpResponse = MediaBrowser.Model.Services.IHttpResponse;
+using IRequest = MediaBrowser.Model.Services.IRequest;
namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
{
public class WebSocketSharpResponse : IHttpResponse
{
private readonly ILogger _logger;
- private readonly HttpListenerResponse response;
+ private readonly HttpListenerResponse _response;
public WebSocketSharpResponse(ILogger logger, HttpListenerResponse response, IRequest request)
{
_logger = logger;
- this.response = response;
+ this._response = response;
Items = new Dictionary<string, object>();
Request = request;
}
@@ -28,28 +29,28 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
public Dictionary<string, object> Items { get; private set; }
public object OriginalResponse
{
- get { return response; }
+ get { return _response; }
}
public int StatusCode
{
- get { return this.response.StatusCode; }
- set { this.response.StatusCode = value; }
+ get { return this._response.StatusCode; }
+ set { this._response.StatusCode = value; }
}
public string StatusDescription
{
- get { return this.response.StatusDescription; }
- set { this.response.StatusDescription = value; }
+ get { return this._response.StatusDescription; }
+ set { this._response.StatusDescription = value; }
}
public string ContentType
{
- get { return response.ContentType; }
- set { response.ContentType = value; }
+ get { return _response.ContentType; }
+ set { _response.ContentType = value; }
}
- public ICookies Cookies { get; set; }
+ //public ICookies Cookies { get; set; }
public void AddHeader(string name, string value)
{
@@ -59,22 +60,22 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
return;
}
- response.AddHeader(name, value);
+ _response.AddHeader(name, value);
}
public string GetHeader(string name)
{
- return response.Headers[name];
+ return _response.Headers[name];
}
public void Redirect(string url)
{
- response.Redirect(url);
+ _response.Redirect(url);
}
public Stream OutputStream
{
- get { return response.OutputStream; }
+ get { return _response.OutputStream; }
}
public object Dto { get; set; }
@@ -82,9 +83,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
public void Write(string text)
{
var bOutput = System.Text.Encoding.UTF8.GetBytes(text);
- response.ContentLength64 = bOutput.Length;
+ _response.ContentLength64 = bOutput.Length;
- var outputStream = response.OutputStream;
+ var outputStream = _response.OutputStream;
outputStream.Write(bOutput, 0, bOutput.Length);
Close();
}
@@ -97,7 +98,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
try
{
- this.response.CloseOutputStream(_logger);
+ this._response.CloseOutputStream(_logger);
}
catch (Exception ex)
{
@@ -113,7 +114,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
public void Flush()
{
- response.OutputStream.Flush();
+ _response.OutputStream.Flush();
}
public bool IsClosed
@@ -127,19 +128,19 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
//you can happily set the Content-Length header in Asp.Net
//but HttpListener will complain if you do - you have to set ContentLength64 on the response.
//workaround: HttpListener throws "The parameter is incorrect" exceptions when we try to set the Content-Length header
- response.ContentLength64 = contentLength;
+ _response.ContentLength64 = contentLength;
}
public void SetCookie(Cookie cookie)
{
var cookieStr = cookie.AsHeaderValue();
- response.Headers.Add(HttpHeaders.SetCookie, cookieStr);
+ _response.Headers.Add(HttpHeaders.SetCookie, cookieStr);
}
public bool SendChunked
{
- get { return response.SendChunked; }
- set { response.SendChunked = value; }
+ get { return _response.SendChunked; }
+ set { _response.SendChunked = value; }
}
public bool KeepAlive { get; set; }
diff --git a/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs
index 5f122fb96f..60d0d7c414 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs
@@ -1,19 +1,19 @@
using MediaBrowser.Model.Logging;
-using ServiceStack.Web;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
+using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.IO;
-using ServiceStack;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.HttpServer
{
/// <summary>
/// Class StreamWriter
/// </summary>
- public class StreamWriter : IStreamWriter, IAsyncStreamWriter, IHasOptions
+ public class StreamWriter : IAsyncStreamWriter, IHasHeaders
{
private ILogger Logger { get; set; }
@@ -33,7 +33,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// Gets the options.
/// </summary>
/// <value>The options.</value>
- public IDictionary<string, string> Options
+ public IDictionary<string, string> Headers
{
get { return _options; }
}
@@ -58,11 +58,11 @@ namespace MediaBrowser.Server.Implementations.HttpServer
SourceStream = source;
Logger = logger;
- Options["Content-Type"] = contentType;
+ Headers["Content-Type"] = contentType;
if (source.CanSeek)
{
- Options["Content-Length"] = source.Length.ToString(UsCulture);
+ Headers["Content-Length"] = source.Length.ToString(UsCulture);
}
}
@@ -83,54 +83,14 @@ namespace MediaBrowser.Server.Implementations.HttpServer
_bytes = source;
Logger = logger;
- Options["Content-Type"] = contentType;
+ Headers["Content-Type"] = contentType;
- Options["Content-Length"] = source.Length.ToString(UsCulture);
+ Headers["Content-Length"] = source.Length.ToString(UsCulture);
}
private const int BufferSize = 81920;
- /// <summary>
- /// Writes to.
- /// </summary>
- /// <param name="responseStream">The response stream.</param>
- public void WriteTo(Stream responseStream)
- {
- try
- {
- if (_bytes != null)
- {
- responseStream.Write(_bytes, 0, _bytes.Length);
- }
- else
- {
- using (var src = SourceStream)
- {
- src.CopyTo(responseStream, BufferSize);
- }
- }
- }
- catch (Exception ex)
- {
- Logger.ErrorException("Error streaming data", ex);
-
- if (OnError != null)
- {
- OnError();
- }
-
- throw;
- }
- finally
- {
- if (OnComplete != null)
- {
- OnComplete();
- }
- }
- }
-
- public async Task WriteToAsync(Stream responseStream)
+ public async Task WriteToAsync(Stream responseStream, CancellationToken cancellationToken)
{
try
{
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SwaggerService.cs b/MediaBrowser.Server.Implementations/HttpServer/SwaggerService.cs
index d91f316d6d..54ee5fbb21 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/SwaggerService.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/SwaggerService.cs
@@ -1,11 +1,11 @@
using MediaBrowser.Controller;
using MediaBrowser.Controller.Net;
-using ServiceStack.Web;
using System.IO;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.HttpServer
{
- public class SwaggerService : IHasResultFactory, IRestfulService
+ public class SwaggerService : IHasResultFactory, IService
{
private readonly IServerApplicationPaths _appPaths;
diff --git a/MediaBrowser.Server.Implementations/IO/FileRefresher.cs b/MediaBrowser.Server.Implementations/IO/FileRefresher.cs
index 1c9a057537..beb9600c79 100644
--- a/MediaBrowser.Server.Implementations/IO/FileRefresher.cs
+++ b/MediaBrowser.Server.Implementations/IO/FileRefresher.cs
@@ -4,11 +4,13 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.Events;
+using MediaBrowser.Common.IO;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Logging;
@@ -237,7 +239,7 @@ namespace MediaBrowser.Server.Implementations.IO
|| data.IsDirectory
// Opening a writable stream will fail with readonly files
- || data.Attributes.HasFlag(FileAttributes.ReadOnly))
+ || data.IsReadOnly)
{
return false;
}
@@ -256,12 +258,12 @@ namespace MediaBrowser.Server.Implementations.IO
// But if the server only has readonly access, this is going to cause this entire algorithm to fail
// So we'll take a best guess about our access level
var requestedFileAccess = ConfigurationManager.Configuration.SaveLocalMeta
- ? FileAccess.ReadWrite
- : FileAccess.Read;
+ ? FileAccessMode.ReadWrite
+ : FileAccessMode.Read;
try
{
- using (_fileSystem.GetFileStream(path, FileMode.Open, requestedFileAccess, FileShare.ReadWrite))
+ using (_fileSystem.GetFileStream(path, FileOpenMode.Open, requestedFileAccess, FileShareMode.ReadWrite))
{
//file is not locked
return false;
diff --git a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
index 69d37591c4..8d92c2a037 100644
--- a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
+++ b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
@@ -12,8 +12,10 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Tasks;
namespace MediaBrowser.Server.Implementations.IO
diff --git a/MediaBrowser.Server.Implementations/IO/ThrottledStream.cs b/MediaBrowser.Server.Implementations/IO/ThrottledStream.cs
new file mode 100644
index 0000000000..538812dc0b
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/IO/ThrottledStream.cs
@@ -0,0 +1,393 @@
+using System;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Server.Implementations.IO
+{
+ /// <summary>
+ /// Class for streaming data with throttling support.
+ /// </summary>
+ public class ThrottledStream : Stream
+ {
+ /// <summary>
+ /// A constant used to specify an infinite number of bytes that can be transferred per second.
+ /// </summary>
+ public const long Infinite = 0;
+
+ #region Private members
+ /// <summary>
+ /// The base stream.
+ /// </summary>
+ private readonly Stream _baseStream;
+
+ /// <summary>
+ /// The maximum bytes per second that can be transferred through the base stream.
+ /// </summary>
+ private long _maximumBytesPerSecond;
+
+ /// <summary>
+ /// The number of bytes that has been transferred since the last throttle.
+ /// </summary>
+ private long _byteCount;
+
+ /// <summary>
+ /// The start time in milliseconds of the last throttle.
+ /// </summary>
+ private long _start;
+ #endregion
+
+ #region Properties
+ /// <summary>
+ /// Gets the current milliseconds.
+ /// </summary>
+ /// <value>The current milliseconds.</value>
+ protected long CurrentMilliseconds
+ {
+ get
+ {
+ return Environment.TickCount;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the maximum bytes per second that can be transferred through the base stream.
+ /// </summary>
+ /// <value>The maximum bytes per second.</value>
+ public long MaximumBytesPerSecond
+ {
+ get
+ {
+ return _maximumBytesPerSecond;
+ }
+ set
+ {
+ if (MaximumBytesPerSecond != value)
+ {
+ _maximumBytesPerSecond = value;
+ Reset();
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current stream supports reading.
+ /// </summary>
+ /// <returns>true if the stream supports reading; otherwise, false.</returns>
+ public override bool CanRead
+ {
+ get
+ {
+ return _baseStream.CanRead;
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current stream supports seeking.
+ /// </summary>
+ /// <value></value>
+ /// <returns>true if the stream supports seeking; otherwise, false.</returns>
+ public override bool CanSeek
+ {
+ get
+ {
+ return _baseStream.CanSeek;
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current stream supports writing.
+ /// </summary>
+ /// <value></value>
+ /// <returns>true if the stream supports writing; otherwise, false.</returns>
+ public override bool CanWrite
+ {
+ get
+ {
+ return _baseStream.CanWrite;
+ }
+ }
+
+ /// <summary>
+ /// Gets the length in bytes of the stream.
+ /// </summary>
+ /// <value></value>
+ /// <returns>A long value representing the length of the stream in bytes.</returns>
+ /// <exception cref="T:System.NotSupportedException">The base stream does not support seeking. </exception>
+ /// <exception cref="T:System.ObjectDisposedException">Methods were called after the stream was closed. </exception>
+ public override long Length
+ {
+ get
+ {
+ return _baseStream.Length;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the position within the current stream.
+ /// </summary>
+ /// <value></value>
+ /// <returns>The current position within the stream.</returns>
+ /// <exception cref="T:System.IO.IOException">An I/O error occurs. </exception>
+ /// <exception cref="T:System.NotSupportedException">The base stream does not support seeking. </exception>
+ /// <exception cref="T:System.ObjectDisposedException">Methods were called after the stream was closed. </exception>
+ public override long Position
+ {
+ get
+ {
+ return _baseStream.Position;
+ }
+ set
+ {
+ _baseStream.Position = value;
+ }
+ }
+ #endregion
+
+ public long MinThrottlePosition;
+
+ #region Ctor
+ /// <summary>
+ /// Initializes a new instance of the <see cref="T:ThrottledStream"/> class.
+ /// </summary>
+ /// <param name="baseStream">The base stream.</param>
+ /// <param name="maximumBytesPerSecond">The maximum bytes per second that can be transferred through the base stream.</param>
+ /// <exception cref="ArgumentNullException">Thrown when <see cref="baseStream"/> is a null reference.</exception>
+ /// <exception cref="ArgumentOutOfRangeException">Thrown when <see cref="maximumBytesPerSecond"/> is a negative value.</exception>
+ public ThrottledStream(Stream baseStream, long maximumBytesPerSecond)
+ {
+ if (baseStream == null)
+ {
+ throw new ArgumentNullException("baseStream");
+ }
+
+ if (maximumBytesPerSecond < 0)
+ {
+ throw new ArgumentOutOfRangeException("maximumBytesPerSecond",
+ maximumBytesPerSecond, "The maximum number of bytes per second can't be negative.");
+ }
+
+ _baseStream = baseStream;
+ _maximumBytesPerSecond = maximumBytesPerSecond;
+ _start = CurrentMilliseconds;
+ _byteCount = 0;
+ }
+ #endregion
+
+ #region Public methods
+ /// <summary>
+ /// Clears all buffers for this stream and causes any buffered data to be written to the underlying device.
+ /// </summary>
+ /// <exception cref="T:System.IO.IOException">An I/O error occurs.</exception>
+ public override void Flush()
+ {
+ _baseStream.Flush();
+ }
+
+ /// <summary>
+ /// Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read.
+ /// </summary>
+ /// <param name="buffer">An array of bytes. When this method returns, the buffer contains the specified byte array with the values between offset and (offset + count - 1) replaced by the bytes read from the current source.</param>
+ /// <param name="offset">The zero-based byte offset in buffer at which to begin storing the data read from the current stream.</param>
+ /// <param name="count">The maximum number of bytes to be read from the current stream.</param>
+ /// <returns>
+ /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached.
+ /// </returns>
+ /// <exception cref="T:System.ArgumentException">The sum of offset and count is larger than the buffer length. </exception>
+ /// <exception cref="T:System.ObjectDisposedException">Methods were called after the stream was closed. </exception>
+ /// <exception cref="T:System.NotSupportedException">The base stream does not support reading. </exception>
+ /// <exception cref="T:System.ArgumentNullException">buffer is null. </exception>
+ /// <exception cref="T:System.IO.IOException">An I/O error occurs. </exception>
+ /// <exception cref="T:System.ArgumentOutOfRangeException">offset or count is negative. </exception>
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ Throttle(count);
+
+ return _baseStream.Read(buffer, offset, count);
+ }
+
+ /// <summary>
+ /// Sets the position within the current stream.
+ /// </summary>
+ /// <param name="offset">A byte offset relative to the origin parameter.</param>
+ /// <param name="origin">A value of type <see cref="T:System.IO.SeekOrigin"></see> indicating the reference point used to obtain the new position.</param>
+ /// <returns>
+ /// The new position within the current stream.
+ /// </returns>
+ /// <exception cref="T:System.IO.IOException">An I/O error occurs. </exception>
+ /// <exception cref="T:System.NotSupportedException">The base stream does not support seeking, such as if the stream is constructed from a pipe or console output. </exception>
+ /// <exception cref="T:System.ObjectDisposedException">Methods were called after the stream was closed. </exception>
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ return _baseStream.Seek(offset, origin);
+ }
+
+ /// <summary>
+ /// Sets the length of the current stream.
+ /// </summary>
+ /// <param name="value">The desired length of the current stream in bytes.</param>
+ /// <exception cref="T:System.NotSupportedException">The base stream does not support both writing and seeking, such as if the stream is constructed from a pipe or console output. </exception>
+ /// <exception cref="T:System.IO.IOException">An I/O error occurs. </exception>
+ /// <exception cref="T:System.ObjectDisposedException">Methods were called after the stream was closed. </exception>
+ public override void SetLength(long value)
+ {
+ _baseStream.SetLength(value);
+ }
+
+ private long _bytesWritten;
+
+ /// <summary>
+ /// Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written.
+ /// </summary>
+ /// <param name="buffer">An array of bytes. This method copies count bytes from buffer to the current stream.</param>
+ /// <param name="offset">The zero-based byte offset in buffer at which to begin copying bytes to the current stream.</param>
+ /// <param name="count">The number of bytes to be written to the current stream.</param>
+ /// <exception cref="T:System.IO.IOException">An I/O error occurs. </exception>
+ /// <exception cref="T:System.NotSupportedException">The base stream does not support writing. </exception>
+ /// <exception cref="T:System.ObjectDisposedException">Methods were called after the stream was closed. </exception>
+ /// <exception cref="T:System.ArgumentNullException">buffer is null. </exception>
+ /// <exception cref="T:System.ArgumentException">The sum of offset and count is greater than the buffer length. </exception>
+ /// <exception cref="T:System.ArgumentOutOfRangeException">offset or count is negative. </exception>
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ Throttle(count);
+
+ _baseStream.Write(buffer, offset, count);
+
+ _bytesWritten += count;
+ }
+
+ public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ {
+ await ThrottleAsync(count, cancellationToken).ConfigureAwait(false);
+
+ await _baseStream.WriteAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false);
+
+ _bytesWritten += count;
+ }
+
+ /// <summary>
+ /// Returns a <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.
+ /// </summary>
+ /// <returns>
+ /// A <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.
+ /// </returns>
+ public override string ToString()
+ {
+ return _baseStream.ToString();
+ }
+ #endregion
+
+ private bool ThrottleCheck(int bufferSizeInBytes)
+ {
+ if (_bytesWritten < MinThrottlePosition)
+ {
+ return false;
+ }
+
+ // Make sure the buffer isn't empty.
+ if (_maximumBytesPerSecond <= 0 || bufferSizeInBytes <= 0)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ #region Protected methods
+ /// <summary>
+ /// Throttles for the specified buffer size in bytes.
+ /// </summary>
+ /// <param name="bufferSizeInBytes">The buffer size in bytes.</param>
+ protected void Throttle(int bufferSizeInBytes)
+ {
+ if (!ThrottleCheck(bufferSizeInBytes))
+ {
+ return ;
+ }
+
+ _byteCount += bufferSizeInBytes;
+ long elapsedMilliseconds = CurrentMilliseconds - _start;
+
+ if (elapsedMilliseconds > 0)
+ {
+ // Calculate the current bps.
+ long bps = _byteCount * 1000L / elapsedMilliseconds;
+
+ // If the bps are more then the maximum bps, try to throttle.
+ if (bps > _maximumBytesPerSecond)
+ {
+ // Calculate the time to sleep.
+ long wakeElapsed = _byteCount * 1000L / _maximumBytesPerSecond;
+ int toSleep = (int)(wakeElapsed - elapsedMilliseconds);
+
+ if (toSleep > 1)
+ {
+ try
+ {
+ // The time to sleep is more then a millisecond, so sleep.
+ Thread.Sleep(toSleep);
+ }
+ catch (ThreadAbortException)
+ {
+ // Eatup ThreadAbortException.
+ }
+
+ // A sleep has been done, reset.
+ Reset();
+ }
+ }
+ }
+ }
+
+ protected async Task ThrottleAsync(int bufferSizeInBytes, CancellationToken cancellationToken)
+ {
+ if (!ThrottleCheck(bufferSizeInBytes))
+ {
+ return;
+ }
+
+ _byteCount += bufferSizeInBytes;
+ long elapsedMilliseconds = CurrentMilliseconds - _start;
+
+ if (elapsedMilliseconds > 0)
+ {
+ // Calculate the current bps.
+ long bps = _byteCount * 1000L / elapsedMilliseconds;
+
+ // If the bps are more then the maximum bps, try to throttle.
+ if (bps > _maximumBytesPerSecond)
+ {
+ // Calculate the time to sleep.
+ long wakeElapsed = _byteCount * 1000L / _maximumBytesPerSecond;
+ int toSleep = (int)(wakeElapsed - elapsedMilliseconds);
+
+ if (toSleep > 1)
+ {
+ // The time to sleep is more then a millisecond, so sleep.
+ await Task.Delay(toSleep, cancellationToken).ConfigureAwait(false);
+
+ // A sleep has been done, reset.
+ Reset();
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Will reset the bytecount to 0 and reset the start time to the current time.
+ /// </summary>
+ protected void Reset()
+ {
+ long difference = CurrentMilliseconds - _start;
+
+ // Only reset counters when a known history is available of more then 1 second.
+ if (difference > 1000)
+ {
+ _byteCount = 0;
+ _start = CurrentMilliseconds;
+ }
+ }
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
index f16aa934f1..72a63c5472 100644
--- a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
+++ b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Localization;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using System;
@@ -12,8 +11,11 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Extensions;
+using MediaBrowser.Model.Globalization;
namespace MediaBrowser.Server.Implementations.Intros
{
diff --git a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
index b550d1dda2..f20d87c4bc 100644
--- a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
+++ b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
@@ -6,7 +6,9 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Library
{
@@ -53,7 +55,7 @@ namespace MediaBrowser.Server.Implementations.Library
public bool ShouldIgnore(FileSystemMetadata fileInfo, BaseItem parent)
{
var filename = fileInfo.Name;
- var isHidden = (fileInfo.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden;
+ var isHidden = fileInfo.IsHidden;
var path = fileInfo.FullName;
// Handle mac .DS_Store
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index cf175f8617..4b7971fcac 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -32,7 +32,7 @@ using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
@@ -43,6 +43,7 @@ using MediaBrowser.Server.Implementations.Library.Resolvers;
using SortOrder = MediaBrowser.Model.Entities.SortOrder;
using VideoResolver = MediaBrowser.Naming.Video.VideoResolver;
using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
using MediaBrowser.Model.Tasks;
namespace MediaBrowser.Server.Implementations.Library
@@ -2464,7 +2465,7 @@ namespace MediaBrowser.Server.Implementations.Library
var videos = videoListResolver.Resolve(fileSystemChildren.Select(i => new FileMetadata
{
Id = i.FullName,
- IsFolder = (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory
+ IsFolder = i.IsDirectory
}).ToList());
@@ -2513,7 +2514,7 @@ namespace MediaBrowser.Server.Implementations.Library
var videos = videoListResolver.Resolve(fileSystemChildren.Select(i => new FileMetadata
{
Id = i.FullName,
- IsFolder = (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory
+ IsFolder = i.IsDirectory
}).ToList());
diff --git a/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs b/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs
index e7bfe56f2e..0f1931dda5 100644
--- a/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs
@@ -14,7 +14,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Server.Implementations.Library
diff --git a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
index 9f949db92a..c7d9d39b88 100644
--- a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
+++ b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
@@ -5,7 +5,9 @@ using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Library
{
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs
index 7f35fc3ea5..c1ac7d68cd 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs
@@ -9,8 +9,10 @@ using MediaBrowser.Server.Implementations.Logging;
using System;
using System.Collections.Generic;
using System.IO;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
@@ -112,7 +114,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
foreach (var fileSystemInfo in list)
{
- if ((fileSystemInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
+ if (fileSystemInfo.IsDirectory)
{
if (allowSubfolders)
{
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs
index 686105ddb1..be651b9c80 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs
@@ -6,8 +6,10 @@ using MediaBrowser.Model.Logging;
using System;
using System.IO;
using System.Linq;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.IO;
namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
{
@@ -85,7 +87,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
var albumResolver = new MusicAlbumResolver(_logger, _fileSystem, _libraryManager);
// If we contain an album assume we are an artist folder
- return args.FileSystemChildren.Where(i => (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory).Any(i => albumResolver.IsMusicAlbum(i.FullName, directoryService, args.GetLibraryOptions())) ? new MusicArtist() : null;
+ return args.FileSystemChildren.Where(i => i.IsDirectory).Any(i => albumResolver.IsMusicAlbum(i.FullName, directoryService, args.GetLibraryOptions())) ? new MusicArtist() : null;
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs
index d0042a9907..4dce16139f 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs
@@ -57,7 +57,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
{
var filename = child.Name;
- if ((child.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
+ if (child.IsDirectory)
{
if (IsDvdDirectory(filename))
{
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index 5f41995647..40a3aa3258 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -13,7 +13,9 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
{
@@ -116,7 +118,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
// Loop through each child file/folder and see if we find a video
foreach (var child in fileSystemEntries)
{
- if ((child.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
+ if (child.IsDirectory)
{
leftOver.Add(child);
}
@@ -368,7 +370,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
{
var filename = child.Name;
- if ((child.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
+ if (child.IsDirectory)
{
if (IsDvdDirectory(filename))
{
@@ -449,7 +451,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
.ToList();
var subfolders = subFileEntries
- .Where(e => (e.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
+ .Where(e => e.IsDirectory)
.Select(d => d.Name)
.ToList();
@@ -465,7 +467,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
}
var subFiles = subFileEntries
- .Where(e => (e.Attributes & FileAttributes.Directory) != FileAttributes.Directory)
+ .Where(e => !e.IsDirectory)
.Select(d => d.Name);
if (subFiles.Any(IsDvdFile))
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs
index e7f2397800..957fafb92f 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs
@@ -41,7 +41,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
private bool HasPhotos(ItemResolveArgs args)
{
- return args.FileSystemChildren.Any(i => ((i.Attributes & FileAttributes.Directory) != FileAttributes.Directory) && PhotoResolver.IsImageFile(i.FullName, _imageProcessor));
+ return args.FileSystemChildren.Any(i => (!i.IsDirectory) && PhotoResolver.IsImageFile(i.FullName, _imageProcessor));
}
public override ResolverPriority Priority
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs
index d4ebb8457b..549ad522ed 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs
@@ -5,8 +5,10 @@ using MediaBrowser.Model.Entities;
using System;
using System.IO;
using System.Linq;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Server.Implementations.Library.Resolvers
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs
index 7bb66ed89d..7a6198a005 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs
@@ -5,7 +5,9 @@ using MediaBrowser.Controller.Resolvers;
using System;
using System.IO;
using System.Linq;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Library.Resolvers
{
@@ -67,7 +69,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
try
{
- return (i.Attributes & FileAttributes.Directory) != FileAttributes.Directory &&
+ return !i.IsDirectory &&
string.Equals(".collection", i.Extension, StringComparison.OrdinalIgnoreCase);
}
catch (IOException)
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
index 3217cd67b9..83566e2c14 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
@@ -11,8 +11,10 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
@@ -128,8 +130,6 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
{
foreach (var child in fileSystemChildren)
{
- var attributes = child.Attributes;
-
//if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
//{
// //logger.Debug("Igoring series file or folder marked hidden: {0}", child.FullName);
@@ -143,7 +143,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
// continue;
//}
- if ((attributes & FileAttributes.Directory) == FileAttributes.Directory)
+ if (child.IsDirectory)
{
if (IsSeasonFolder(child.FullName, isTvContentType, libraryManager))
{
diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs
index 6456d7f81b..794c924eb6 100644
--- a/MediaBrowser.Server.Implementations/Library/UserManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs
@@ -27,7 +27,9 @@ using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Library
{
diff --git a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
index 2cbee7c97f..6a4e26ff94 100644
--- a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
@@ -3,7 +3,6 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Controller.Localization;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Library;
@@ -14,6 +13,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Model.Globalization;
namespace MediaBrowser.Server.Implementations.Library
{
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs
index 93b9c0da1e..d9a7199be7 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs
@@ -11,7 +11,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Library.Validators
{
diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
index 0f8c15e719..4137ab2cf8 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
@@ -2,9 +2,10 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Logging;
@@ -41,7 +42,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
{
_logger.Info("Opened recording stream from tuner provider");
- using (var output = _fileSystem.GetFileStream(targetFile, FileMode.Create, FileAccess.Write, FileShare.Read))
+ using (var output = _fileSystem.GetFileStream(targetFile, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
{
onStarted();
diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
index 214bb87169..397e5fc9f4 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
@@ -26,12 +26,14 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.Events;
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.IO;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.FileOrganization;
using Microsoft.Win32;
@@ -1578,7 +1580,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
return;
}
- using (var stream = _fileSystem.GetFileStream(nfoPath, FileMode.Create, FileAccess.Write, FileShare.Read))
+ using (var stream = _fileSystem.GetFileStream(nfoPath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
{
var settings = new XmlWriterSettings
{
@@ -1613,7 +1615,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
return;
}
- using (var stream = _fileSystem.GetFileStream(nfoPath, FileMode.Create, FileAccess.Write, FileShare.Read))
+ using (var stream = _fileSystem.GetFileStream(nfoPath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
{
var settings = new XmlWriterSettings
{
diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
index cdf8e75974..89e9897656 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
@@ -7,10 +7,11 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
@@ -112,7 +113,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
_fileSystem.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, FileMode.Create, FileAccess.Write, FileShare.Read, true);
+ _logFileStream = _fileSystem.GetFileStream(logFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true);
var commandLineLogMessageBytes = Encoding.UTF8.GetBytes(_json.SerializeToString(mediaSource) + Environment.NewLine + Environment.NewLine + commandLineLogMessage + Environment.NewLine + Environment.NewLine);
_logFileStream.Write(commandLineLogMessageBytes, 0, commandLineLogMessageBytes.Length);
diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
index 7fe271bea4..9bda9c3f60 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
@@ -4,7 +4,9 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
{
diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs
index 40e532c4e6..b2a347b77e 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs
@@ -2,7 +2,9 @@
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using System;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
{
diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs
index bddce04201..1e01df29dc 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs
@@ -8,7 +8,9 @@ using System.Collections.Concurrent;
using System.Globalization;
using System.Linq;
using System.Threading;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.LiveTv;
namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index 3f8eb90250..7b88ccf647 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -9,7 +9,6 @@ using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Sorting;
@@ -26,15 +25,18 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using IniParser;
using IniParser.Model;
using MediaBrowser.Common.Events;
+using MediaBrowser.Common.IO;
using MediaBrowser.Common.Security;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Extensions;
+using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Tasks;
using MediaBrowser.Server.Implementations.LiveTv.Listings;
diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
index 97d52836d3..a32f4cca23 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
@@ -14,10 +14,12 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.IO;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Net;
diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunLiveStream.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunLiveStream.cs
index 91f0ee832f..7bb4dc92e0 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunLiveStream.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunLiveStream.cs
@@ -2,7 +2,7 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.LiveTv;
@@ -14,6 +14,8 @@ using MediaBrowser.Server.Implementations.LiveTv.EmbyTV;
using System.Collections.Generic;
using System.Linq;
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
{
diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs
index 48117f2251..b85b3810a3 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs
@@ -11,10 +11,12 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Server.Implementations.LiveTv.EmbyTV;
diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
index 454abddddb..3bfe902dfb 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
@@ -5,10 +5,12 @@ using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Model.Logging;
diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/SatIpHost.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/SatIpHost.cs
index 1fe767e521..8dca261a38 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/SatIpHost.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/SatIpHost.cs
@@ -4,12 +4,14 @@ using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Dto;
diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs
index ec544dd70c..e4db98b3fc 100644
--- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs
+++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Extensions;
using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Localization;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Serialization;
@@ -11,7 +10,10 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
-using CommonIO;
+using System.Text;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
namespace MediaBrowser.Server.Implementations.Localization
@@ -81,7 +83,7 @@ namespace MediaBrowser.Server.Implementations.Localization
var target = Path.Combine(localizationPath, filename);
_logger.Info("Extracting ratings to {0}", target);
- using (var fs = _fileSystem.GetFileStream(target, FileMode.Create, FileAccess.Write, FileShare.Read))
+ using (var fs = _fileSystem.GetFileStream(target, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
{
stream.CopyTo(fs);
}
@@ -107,6 +109,20 @@ namespace MediaBrowser.Server.Implementations.Localization
}
}
+ public string RemoveDiacritics(string text)
+ {
+ return String.Concat(
+ text.Normalize(NormalizationForm.FormD)
+ .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) !=
+ UnicodeCategory.NonSpacingMark)
+ ).Normalize(NormalizationForm.FormC);
+ }
+
+ public string NormalizeFormKD(string text)
+ {
+ return text.Normalize(NormalizationForm.FormKD);
+ }
+
/// <summary>
/// Gets the cultures.
/// </summary>
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index f301032dec..71e964eec6 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -42,12 +42,8 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
- <Reference Include="CommonIO, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\CommonIO.1.0.0.9\lib\net45\CommonIO.dll</HintPath>
- </Reference>
<Reference Include="Emby.XmlTv, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\Emby.XmlTv.1.0.0.57\lib\portable-net46+win10\Emby.XmlTv.dll</HintPath>
+ <HintPath>..\packages\Emby.XmlTv.1.0.0.58\lib\portable-net46+win10\Emby.XmlTv.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="INIFileParser, Version=2.3.0.0, Culture=neutral, PublicKeyToken=79af7b307b65cf3c, processorArchitecture=MSIL">
@@ -87,9 +83,6 @@
<Reference Include="ServiceStack">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.dll</HintPath>
</Reference>
- <Reference Include="ServiceStack.Client">
- <HintPath>..\ThirdParty\ServiceStack\ServiceStack.Client.dll</HintPath>
- </Reference>
<Reference Include="ServiceStack.Common">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Common.dll</HintPath>
</Reference>
@@ -151,7 +144,6 @@
<Compile Include="EntryPoints\ServerEventNotifier.cs" />
<Compile Include="EntryPoints\UserDataChangeNotifier.cs" />
<Compile Include="FileOrganization\OrganizerScheduledTask.cs" />
- <Compile Include="HttpServer\AsyncStreamWriter.cs" />
<Compile Include="HttpServer\IHttpListener.cs" />
<Compile Include="HttpServer\Security\AuthorizationContext.cs" />
<Compile Include="HttpServer\ContainerAdapter.cs" />
@@ -162,7 +154,6 @@
<Compile Include="HttpServer\RangeRequestWriter.cs" />
<Compile Include="HttpServer\ResponseFilter.cs" />
<Compile Include="HttpServer\Security\AuthService.cs" />
- <Compile Include="HttpServer\Security\SessionAuthProvider.cs" />
<Compile Include="HttpServer\ServerFactory.cs" />
<Compile Include="HttpServer\ServerLogFactory.cs" />
<Compile Include="HttpServer\ServerLogger.cs" />
@@ -179,6 +170,7 @@
<Compile Include="Intros\DefaultIntroProvider.cs" />
<Compile Include="IO\FileRefresher.cs" />
<Compile Include="IO\LibraryMonitor.cs" />
+ <Compile Include="IO\ThrottledStream.cs" />
<Compile Include="Library\CoreResolutionIgnoreRule.cs" />
<Compile Include="Library\LibraryManager.cs" />
<Compile Include="Library\LocalTrailerPostScanTask.cs" />
@@ -278,12 +270,15 @@
<Compile Include="Persistence\DataExtensions.cs" />
<Compile Include="Persistence\IDbConnector.cs" />
<Compile Include="Persistence\MediaStreamColumns.cs" />
+ <Compile Include="Reflection\AssemblyInfo.cs" />
<Compile Include="Social\SharingManager.cs" />
<Compile Include="Social\SharingRepository.cs" />
<Compile Include="Sorting\StartDateComparer.cs" />
<Compile Include="Sync\SyncHelper.cs" />
<Compile Include="Sync\SyncJobOptions.cs" />
<Compile Include="Sync\SyncNotificationEntryPoint.cs" />
+ <Compile Include="Threading\PeriodicTimer.cs" />
+ <Compile Include="TV\SeriesPostScanTask.cs" />
<Compile Include="UserViews\CollectionFolderImageProvider.cs" />
<Compile Include="UserViews\DynamicImageProvider.cs" />
<Compile Include="News\NewsEntryPoint.cs" />
@@ -370,6 +365,7 @@
<Compile Include="TV\TVSeriesManager.cs" />
<Compile Include="Udp\UdpMessageReceivedEventArgs.cs" />
<Compile Include="Udp\UdpServer.cs" />
+ <Compile Include="Xml\XmlReaderSettingsFactory.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MediaBrowser.Common.Implementations\MediaBrowser.Common.Implementations.csproj">
@@ -388,6 +384,10 @@
<Project>{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}</Project>
<Name>MediaBrowser.Model</Name>
</ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Providers\MediaBrowser.Providers.csproj">
+ <Project>{442b5058-dcaf-4263-bb6a-f21e31120a1b}</Project>
+ <Name>MediaBrowser.Providers</Name>
+ </ProjectReference>
<ProjectReference Include="..\Mono.Nat\Mono.Nat.csproj">
<Project>{d7453b88-2266-4805-b39b-2b5a2a33e1ba}</Project>
<Name>Mono.Nat</Name>
diff --git a/MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs b/MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs
index 21e847c680..9f1744cc90 100644
--- a/MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs
+++ b/MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs
@@ -13,7 +13,9 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Library;
namespace MediaBrowser.Server.Implementations.MediaEncoder
diff --git a/MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs b/MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs
index 0c214b73a0..22cb4e86ac 100644
--- a/MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs
+++ b/MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs
@@ -15,8 +15,10 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
-using CommonIO;
-using MediaBrowser.Controller.Threading;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Server.Implementations.Threading;
namespace MediaBrowser.Server.Implementations.News
{
diff --git a/MediaBrowser.Server.Implementations/News/NewsService.cs b/MediaBrowser.Server.Implementations/News/NewsService.cs
index 684363d01a..0059ba4214 100644
--- a/MediaBrowser.Server.Implementations/News/NewsService.cs
+++ b/MediaBrowser.Server.Implementations/News/NewsService.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Common.Configuration;
-using MediaBrowser.Controller.News;
using MediaBrowser.Model.News;
using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Serialization;
diff --git a/MediaBrowser.Server.Implementations/Notifications/CoreNotificationTypes.cs b/MediaBrowser.Server.Implementations/Notifications/CoreNotificationTypes.cs
index 8ca6677398..0f2629f587 100644
--- a/MediaBrowser.Server.Implementations/Notifications/CoreNotificationTypes.cs
+++ b/MediaBrowser.Server.Implementations/Notifications/CoreNotificationTypes.cs
@@ -1,10 +1,10 @@
using MediaBrowser.Controller;
-using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Notifications;
using MediaBrowser.Model.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
+using MediaBrowser.Model.Globalization;
namespace MediaBrowser.Server.Implementations.Notifications
{
diff --git a/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs b/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs
index 0916f19f79..a3531b9a5d 100644
--- a/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs
@@ -12,12 +12,14 @@ using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Tasks;
using MediaBrowser.Server.Implementations.ScheduledTasks;
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index e6512f4dfd..667f6b89af 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -1112,7 +1112,10 @@ namespace MediaBrowser.Server.Implementations.Persistence
private string SerializeProviderIds(BaseItem item)
{
- var ids = item.ProviderIds.ToList();
+ // Ideally we shouldn't need this IsNullOrWhiteSpace check but we're seeing some cases of bad data slip through
+ var ids = item.ProviderIds
+ .Where(i => !string.IsNullOrWhiteSpace(i.Value))
+ .ToList();
if (ids.Count == 0)
{
@@ -1140,7 +1143,10 @@ namespace MediaBrowser.Server.Implementations.Persistence
{
var idParts = part.Split('=');
- item.SetProviderId(idParts[0], idParts[1]);
+ if (idParts.Length == 2)
+ {
+ item.SetProviderId(idParts[0], idParts[1]);
+ }
}
}
@@ -4886,6 +4892,15 @@ namespace MediaBrowser.Server.Implementations.Persistence
foreach (var pair in newValues)
{
+ if (string.IsNullOrWhiteSpace(pair.Key))
+ {
+ continue;
+ }
+ if (string.IsNullOrWhiteSpace(pair.Value))
+ {
+ continue;
+ }
+
_saveProviderIdsCommand.GetParameter(0).Value = itemId;
_saveProviderIdsCommand.GetParameter(1).Value = pair.Key;
_saveProviderIdsCommand.GetParameter(2).Value = pair.Value;
diff --git a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
index 22d7ba3bec..0dd7672bc1 100644
--- a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
@@ -12,8 +12,10 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Server.Implementations.Photos
diff --git a/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
index fafb2f2685..ab03f5aaa9 100644
--- a/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
@@ -5,7 +5,9 @@ using MediaBrowser.Controller.Providers;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Server.Implementations.Photos
diff --git a/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs b/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
index 63dfe20b2f..eff77574d3 100644
--- a/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
+++ b/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
@@ -4,9 +4,11 @@ using MediaBrowser.Controller.Playlists;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Querying;
using System.Threading.Tasks;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
namespace MediaBrowser.Server.Implementations.Playlists
{
diff --git a/MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs b/MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs
index be5066ac36..0249b85ee5 100644
--- a/MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs
@@ -10,7 +10,9 @@ using MediaBrowser.Server.Implementations.Photos;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Querying;
diff --git a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs
index ba1559bd03..13202d94c2 100644
--- a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs
+++ b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs
@@ -12,7 +12,9 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Playlists
{
diff --git a/MediaBrowser.Server.Implementations/Reflection/AssemblyInfo.cs b/MediaBrowser.Server.Implementations/Reflection/AssemblyInfo.cs
new file mode 100644
index 0000000000..ec25e7951e
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Reflection/AssemblyInfo.cs
@@ -0,0 +1,14 @@
+using System;
+using System.IO;
+using MediaBrowser.Model.Reflection;
+
+namespace MediaBrowser.Server.Implementations.Reflection
+{
+ public class AssemblyInfo : IAssemblyInfo
+ {
+ public Stream GetManifestResourceStream(Type type, string resource)
+ {
+ return type.Assembly.GetManifestResourceStream(resource);
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs
index 9ff1172f34..41f1ed2403 100644
--- a/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs
+++ b/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs
@@ -11,7 +11,9 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Tasks;
diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs
index 3192c91f4a..f10dbcfe7d 100644
--- a/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs
+++ b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs
@@ -4,7 +4,9 @@ using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.ScheduledTasks
{
diff --git a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
index a9b6ad6a5f..4e706324f9 100644
--- a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
+++ b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
@@ -15,6 +15,7 @@ using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.IO;
using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.ServerManager
{
@@ -158,7 +159,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
{
OnReceive = ProcessWebSocketMessageReceived,
Url = e.Url,
- QueryString = new NameValueCollection(e.QueryString ?? new NameValueCollection())
+ QueryString = e.QueryString ?? new QueryParamCollection()
};
_webSocketConnections.Add(connection);
diff --git a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
index a1c23edf1d..c1bd8ed6b0 100644
--- a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
+++ b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
@@ -11,6 +11,7 @@ using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.IO;
using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Services;
using UniversalDetector;
namespace MediaBrowser.Server.Implementations.ServerManager
@@ -74,7 +75,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
/// Gets or sets the query string.
/// </summary>
/// <value>The query string.</value>
- public NameValueCollection QueryString { get; set; }
+ public QueryParamCollection QueryString { get; set; }
private readonly IMemoryStreamProvider _memoryStreamProvider;
/// <summary>
diff --git a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs
index ddd7ba53a6..9d30135a78 100644
--- a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs
+++ b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs
@@ -9,6 +9,7 @@ using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
+using MediaBrowser.Model.Services;
namespace MediaBrowser.Server.Implementations.Session
{
@@ -104,7 +105,7 @@ namespace MediaBrowser.Server.Implementations.Session
//}
}
- private Task<SessionInfo> GetSession(NameValueCollection queryString, string remoteEndpoint)
+ private Task<SessionInfo> GetSession(QueryParamCollection queryString, string remoteEndpoint)
{
if (queryString == null)
{
diff --git a/MediaBrowser.Server.Implementations/Social/SharingManager.cs b/MediaBrowser.Server.Implementations/Social/SharingManager.cs
index 95f0ece0c2..0bab7a70d7 100644
--- a/MediaBrowser.Server.Implementations/Social/SharingManager.cs
+++ b/MediaBrowser.Server.Implementations/Social/SharingManager.cs
@@ -3,7 +3,6 @@ using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Social;
using MediaBrowser.Model.Social;
using System;
using System.Threading.Tasks;
diff --git a/MediaBrowser.Server.Implementations/Sorting/OfficialRatingComparer.cs b/MediaBrowser.Server.Implementations/Sorting/OfficialRatingComparer.cs
index dd31109daf..3b1939b706 100644
--- a/MediaBrowser.Server.Implementations/Sorting/OfficialRatingComparer.cs
+++ b/MediaBrowser.Server.Implementations/Sorting/OfficialRatingComparer.cs
@@ -1,6 +1,6 @@
using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Querying;
namespace MediaBrowser.Server.Implementations.Sorting
diff --git a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs
index 3218ac5e76..3e4bff2419 100644
--- a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs
+++ b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs
@@ -17,8 +17,10 @@ using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using Interfaces.IO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Server.Implementations.IO;
namespace MediaBrowser.Server.Implementations.Sync
{
@@ -346,7 +348,7 @@ namespace MediaBrowser.Server.Implementations.Sync
return await supportsDirectCopy.SendFile(inputPath, pathParts, target, progress, cancellationToken).ConfigureAwait(false);
}
- using (var fileStream = _fileSystem.GetFileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
+ using (var fileStream = _fileSystem.GetFileStream(inputPath, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read, true))
{
Stream stream = fileStream;
diff --git a/MediaBrowser.Server.Implementations/Sync/MultiProviderSync.cs b/MediaBrowser.Server.Implementations/Sync/MultiProviderSync.cs
index 97b2b1eb8b..4716041177 100644
--- a/MediaBrowser.Server.Implementations/Sync/MultiProviderSync.cs
+++ b/MediaBrowser.Server.Implementations/Sync/MultiProviderSync.cs
@@ -9,7 +9,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Sync
{
diff --git a/MediaBrowser.Server.Implementations/Sync/ServerSyncScheduledTask.cs b/MediaBrowser.Server.Implementations/Sync/ServerSyncScheduledTask.cs
index def156dfb6..bb02e490b2 100644
--- a/MediaBrowser.Server.Implementations/Sync/ServerSyncScheduledTask.cs
+++ b/MediaBrowser.Server.Implementations/Sync/ServerSyncScheduledTask.cs
@@ -8,7 +8,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Tasks;
namespace MediaBrowser.Server.Implementations.Sync
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncConvertScheduledTask.cs b/MediaBrowser.Server.Implementations/Sync/SyncConvertScheduledTask.cs
index 8601e36109..abbf39d395 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncConvertScheduledTask.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncConvertScheduledTask.cs
@@ -9,7 +9,9 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Tasks;
namespace MediaBrowser.Server.Implementations.Sync
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
index c1eeec26b3..8d2c0b20c2 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
@@ -23,7 +23,8 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.IO;
@@ -770,7 +771,7 @@ namespace MediaBrowser.Server.Implementations.Sync
using (var stream = await _subtitleEncoder.GetSubtitles(streamInfo.ItemId, streamInfo.MediaSourceId, subtitleStreamIndex, subtitleStreamInfo.Format, 0, null, false, cancellationToken).ConfigureAwait(false))
{
- using (var fs = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, true))
+ using (var fs = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
{
await stream.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, cancellationToken).ConfigureAwait(false);
}
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
index 6bdb1692ec..47fb9a6f43 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -28,8 +28,9 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Tasks;
diff --git a/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs b/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs
index 5edc56722d..fca9e763fa 100644
--- a/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs
+++ b/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs
@@ -10,9 +10,10 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Model.IO;
using Interfaces.IO;
using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace MediaBrowser.Server.Implementations.Sync
diff --git a/MediaBrowser.Server.Implementations/TV/SeriesPostScanTask.cs b/MediaBrowser.Server.Implementations/TV/SeriesPostScanTask.cs
new file mode 100644
index 0000000000..a498dfec3c
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/TV/SeriesPostScanTask.cs
@@ -0,0 +1,238 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Plugins;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Globalization;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Tasks;
+using MediaBrowser.Model.Xml;
+using MediaBrowser.Providers.TV;
+
+namespace MediaBrowser.Server.Implementations.TV
+{
+ class SeriesGroup : List<Series>, IGrouping<string, Series>
+ {
+ public string Key { get; set; }
+ }
+
+ class SeriesPostScanTask : ILibraryPostScanTask, IHasOrder
+ {
+ /// <summary>
+ /// The _library manager
+ /// </summary>
+ private readonly ILibraryManager _libraryManager;
+ private readonly IServerConfigurationManager _config;
+ private readonly ILogger _logger;
+ private readonly ILocalizationManager _localization;
+ private readonly IFileSystem _fileSystem;
+ private readonly IXmlReaderSettingsFactory _xmlSettings;
+
+ public SeriesPostScanTask(ILibraryManager libraryManager, ILogger logger, IServerConfigurationManager config, ILocalizationManager localization, IFileSystem fileSystem, IXmlReaderSettingsFactory xmlSettings)
+ {
+ _libraryManager = libraryManager;
+ _logger = logger;
+ _config = config;
+ _localization = localization;
+ _fileSystem = fileSystem;
+ _xmlSettings = xmlSettings;
+ }
+
+ public Task Run(IProgress<double> progress, CancellationToken cancellationToken)
+ {
+ return RunInternal(progress, cancellationToken);
+ }
+
+ private Task RunInternal(IProgress<double> progress, CancellationToken cancellationToken)
+ {
+ var seriesList = _libraryManager.GetItemList(new InternalItemsQuery()
+ {
+ IncludeItemTypes = new[] { typeof(Series).Name },
+ Recursive = true,
+ GroupByPresentationUniqueKey = false
+
+ }).Cast<Series>().ToList();
+
+ var seriesGroups = FindSeriesGroups(seriesList).Where(g => !string.IsNullOrEmpty(g.Key)).ToList();
+
+ return new MissingEpisodeProvider(_logger, _config, _libraryManager, _localization, _fileSystem, _xmlSettings).Run(seriesGroups, true, cancellationToken);
+ }
+
+ internal static IEnumerable<IGrouping<string, Series>> FindSeriesGroups(List<Series> seriesList)
+ {
+ var links = seriesList.ToDictionary(s => s, s => seriesList.Where(c => c != s && ShareProviderId(s, c)).ToList());
+
+ var visited = new HashSet<Series>();
+
+ foreach (var series in seriesList)
+ {
+ if (!visited.Contains(series))
+ {
+ var group = new SeriesGroup();
+ FindAllLinked(series, visited, links, group);
+
+ group.Key = group.Select(s => s.GetProviderId(MetadataProviders.Tvdb)).FirstOrDefault(id => !string.IsNullOrEmpty(id));
+
+ yield return group;
+ }
+ }
+ }
+
+ private static void FindAllLinked(Series series, HashSet<Series> visited, IDictionary<Series, List<Series>> linksMap, List<Series> results)
+ {
+ results.Add(series);
+ visited.Add(series);
+
+ var links = linksMap[series];
+
+ foreach (var s in links)
+ {
+ if (!visited.Contains(s))
+ {
+ FindAllLinked(s, visited, linksMap, results);
+ }
+ }
+ }
+
+ private static bool ShareProviderId(Series a, Series b)
+ {
+ return a.ProviderIds.Any(id =>
+ {
+ string value;
+ return b.ProviderIds.TryGetValue(id.Key, out value) && id.Value == value;
+ });
+ }
+
+ public int Order
+ {
+ get
+ {
+ // Run after tvdb update task
+ return 1;
+ }
+ }
+ }
+
+ public class CleanMissingEpisodesEntryPoint : IServerEntryPoint
+ {
+ private readonly ILibraryManager _libraryManager;
+ private readonly IServerConfigurationManager _config;
+ private readonly ILogger _logger;
+ private readonly ILocalizationManager _localization;
+ private readonly IFileSystem _fileSystem;
+ private readonly object _libraryChangedSyncLock = new object();
+ private const int LibraryUpdateDuration = 180000;
+ private readonly ITaskManager _taskManager;
+ private readonly IXmlReaderSettingsFactory _xmlSettings;
+
+ public CleanMissingEpisodesEntryPoint(ILibraryManager libraryManager, IServerConfigurationManager config, ILogger logger, ILocalizationManager localization, IFileSystem fileSystem, ITaskManager taskManager, IXmlReaderSettingsFactory xmlSettings)
+ {
+ _libraryManager = libraryManager;
+ _config = config;
+ _logger = logger;
+ _localization = localization;
+ _fileSystem = fileSystem;
+ _taskManager = taskManager;
+ _xmlSettings = xmlSettings;
+ }
+
+ private Timer LibraryUpdateTimer { get; set; }
+
+ public void Run()
+ {
+ _libraryManager.ItemAdded += _libraryManager_ItemAdded;
+ }
+
+ private void _libraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
+ {
+ if (!FilterItem(e.Item))
+ {
+ return;
+ }
+
+ lock (_libraryChangedSyncLock)
+ {
+ if (LibraryUpdateTimer == null)
+ {
+ LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, LibraryUpdateDuration, Timeout.Infinite);
+ }
+ else
+ {
+ LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite);
+ }
+ }
+ }
+
+ private async void LibraryUpdateTimerCallback(object state)
+ {
+ try
+ {
+ if (MissingEpisodeProvider.IsRunning)
+ {
+ return;
+ }
+
+ if (_libraryManager.IsScanRunning)
+ {
+ return;
+ }
+
+ var seriesList = _libraryManager.GetItemList(new InternalItemsQuery()
+ {
+ IncludeItemTypes = new[] { typeof(Series).Name },
+ Recursive = true,
+ GroupByPresentationUniqueKey = false
+
+ }).Cast<Series>().ToList();
+
+ var seriesGroups = SeriesPostScanTask.FindSeriesGroups(seriesList).Where(g => !string.IsNullOrEmpty(g.Key)).ToList();
+
+ await new MissingEpisodeProvider(_logger, _config, _libraryManager, _localization, _fileSystem, _xmlSettings)
+ .Run(seriesGroups, false, CancellationToken.None).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in SeriesPostScanTask", ex);
+ }
+ }
+
+ private bool FilterItem(BaseItem item)
+ {
+ return item is Episode && item.LocationType != LocationType.Virtual;
+ }
+
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public void Dispose()
+ {
+ Dispose(true);
+ }
+
+ /// <summary>
+ /// Releases unmanaged and - optionally - managed resources.
+ /// </summary>
+ /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
+ protected virtual void Dispose(bool dispose)
+ {
+ if (dispose)
+ {
+ if (LibraryUpdateTimer != null)
+ {
+ LibraryUpdateTimer.Dispose();
+ LibraryUpdateTimer = null;
+ }
+
+ _libraryManager.ItemAdded -= _libraryManager_ItemAdded;
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Threading/PeriodicTimer.cs b/MediaBrowser.Server.Implementations/Threading/PeriodicTimer.cs
new file mode 100644
index 0000000000..057a84483b
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Threading/PeriodicTimer.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Threading;
+using Microsoft.Win32;
+
+namespace MediaBrowser.Server.Implementations.Threading
+{
+ public class PeriodicTimer : IDisposable
+ {
+ public Action<object> Callback { get; set; }
+ private Timer _timer;
+ private readonly object _state;
+ private readonly object _timerLock = new object();
+ private readonly TimeSpan _period;
+
+ public PeriodicTimer(Action<object> callback, object state, TimeSpan dueTime, TimeSpan period)
+ {
+ if (callback == null)
+ {
+ throw new ArgumentNullException("callback");
+ }
+
+ Callback = callback;
+ _period = period;
+ _state = state;
+
+ StartTimer(dueTime);
+ }
+
+ void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
+ {
+ if (e.Mode == PowerModes.Resume)
+ {
+ DisposeTimer();
+ StartTimer(Timeout.InfiniteTimeSpan);
+ }
+ }
+
+ private void TimerCallback(object state)
+ {
+ Callback(state);
+ }
+
+ private void StartTimer(TimeSpan dueTime)
+ {
+ lock (_timerLock)
+ {
+ _timer = new Timer(TimerCallback, _state, dueTime, _period);
+
+ SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
+ }
+ }
+
+ private void DisposeTimer()
+ {
+ SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
+
+ lock (_timerLock)
+ {
+ if (_timer != null)
+ {
+ _timer.Dispose();
+ _timer = null;
+ }
+ }
+ }
+
+ public void Dispose()
+ {
+ DisposeTimer();
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs b/MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
index 3acadd2f65..33a7b67258 100644
--- a/MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
@@ -11,9 +11,11 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Collections;
using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Querying;
diff --git a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
index f1fd906b5c..61f3c77f05 100644
--- a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
@@ -12,7 +12,9 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using CommonIO;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Model.Extensions;
diff --git a/MediaBrowser.Server.Implementations/Xml/XmlReaderSettingsFactory.cs b/MediaBrowser.Server.Implementations/Xml/XmlReaderSettingsFactory.cs
new file mode 100644
index 0000000000..ae7018ad44
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Xml/XmlReaderSettingsFactory.cs
@@ -0,0 +1,20 @@
+using System.Xml;
+using MediaBrowser.Model.Xml;
+
+namespace MediaBrowser.Server.Implementations.Xml
+{
+ public class XmlReaderSettingsFactory : IXmlReaderSettingsFactory
+ {
+ public XmlReaderSettings Create(bool enableValidation)
+ {
+ var settings = new XmlReaderSettings();
+
+ if (!enableValidation)
+ {
+ settings.ValidationType = ValidationType.None;
+ }
+
+ return settings;
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config
index bc449fd64f..8c2cd15921 100644
--- a/MediaBrowser.Server.Implementations/packages.config
+++ b/MediaBrowser.Server.Implementations/packages.config
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
- <package id="CommonIO" version="1.0.0.9" targetFramework="net45" />
- <package id="Emby.XmlTv" version="1.0.0.57" targetFramework="net46" />
+ <package id="Emby.XmlTv" version="1.0.0.58" targetFramework="net46" />
<package id="ini-parser" version="2.3.0" targetFramework="net45" />
<package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" />
<package id="MediaBrowser.Naming" version="1.0.0.55" targetFramework="net45" />