aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
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 0904c92f1..2af9395c3 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 c992def39..f3c52088b 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 1369efae1..ffb9c96e7 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 1ab36c004..d70d4b9e6 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 cb2bd645d..f074fd812 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 50bb6c559..2d0c3642e 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 e8669bbc2..f48b79674 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 2562c0d71..769b7821a 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 d7c1b0da0..27bbfbe82 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 3dfc04c26..19a0593e3 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 c3db9140c..e2e59df08 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 6e67af82b..05e3b68f1 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 d071558c3..a06656b21 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 6e4451d96..de0719a62 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 fb5bdb790..9db49f97a 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 38bf89c62..47f22cae6 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 5e01666a9..19592bc4e 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 9aa49946d..63cc1dc68 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 2cc8d0ea5..8b876904f 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 4f42d8a20..d83aee25b 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 e44b0c6af..000000000
--- 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 21522a9da..71704f8e2 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 10d6f7493..de41481cc 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 dc315601f..7db935d43 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 4b94095f5..7d4cd3b4d 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 ee05702f4..f5a11ae1f 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 bc3e7b163..edbb5e512 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 7c3173101..000000000
--- 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 a498d32fa..f51ca55a8 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 b2cbf2387..4dff2d5a3 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 3ef48d13a..49d6bceb4 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 d20dd7ec0..13ae48cff 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 5509eb627..37bd00602 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 59e0b2a9b..2546519f4 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 a58645ec5..3aae6c9ca 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 5f122fb96..60d0d7c41 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 d91f316d6..54ee5fbb2 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 1c9a05753..beb9600c7 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 69d37591c..8d92c2a03 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 000000000..538812dc0
--- /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 f16aa934f..72a63c547 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 b550d1dda..f20d87c4b 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 cf175f861..4b7971fca 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 e7bfe56f2..0f1931dda 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 9f949db92..c7d9d39b8 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 7f35fc3ea..c1ac7d68c 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 686105ddb..be651b9c8 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 d0042a990..4dce16139 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 5f4199564..40a3aa325 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 e7f239780..957fafb92 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 d4ebb8457..549ad522e 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 7bb66ed89..7a6198a00 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 3217cd67b..83566e2c1 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 6456d7f81..794c924eb 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 2cbee7c97..6a4e26ff9 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 93b9c0da1..d9a7199be 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 0f8c15e71..4137ab2cf 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 214bb8716..397e5fc9f 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 cdf8e7597..89e989765 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 7fe271bea..9bda9c3f6 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 40e532c4e..b2a347b77 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 bddce0420..1e01df29d 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 3f8eb9025..7b88ccf64 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 97d52836d..a32f4cca2 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 91f0ee832..7bb4dc92e 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 48117f225..b85b3810a 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 454abdddd..3bfe902df 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 1fe767e52..8dca261a3 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 ec544dd70..e4db98b3f 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 f301032de..71e964eec 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 21e847c68..9f1744cc9 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 0c214b73a..22cb4e86a 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 684363d01..0059ba421 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 8ca667739..0f2629f58 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 0916f19f7..a3531b9a5 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 e6512f4df..667f6b89a 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 22d7ba3be..0dd7672bc 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 fafb2f268..ab03f5aaa 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 63dfe20b2..eff77574d 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 be5066ac3..0249b85ee 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 ba1559bd0..13202d94c 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 000000000..ec25e7951
--- /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 9ff1172f3..41f1ed240 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 3192c91f4..f10dbcfe7 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 a9b6ad6a5..4e706324f 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 a1c23edf1..c1bd8ed6b 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 ddd7ba53a..9d30135a7 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 95f0ece0c..0bab7a70d 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 dd31109da..3b1939b70 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 3218ac5e7..3e4bff241 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 97b2b1eb8..471604117 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 def156dfb..bb02e490b 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 8601e3610..abbf39d39 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 c1eeec26b..8d2c0b20c 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 6bdb1692e..47fb9a6f4 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 5edc56722..fca9e763f 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 000000000..a498dfec3
--- /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 000000000..057a84483
--- /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 3acadd2f6..33a7b6725 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 f1fd906b5..61f3c77f0 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 000000000..ae7018ad4
--- /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 bc449fd64..8c2cd1592 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" />