diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-10-25 15:02:04 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-10-25 15:02:04 -0400 |
| commit | ef6b90b8e6e6c317fcda85a392c79324f91250db (patch) | |
| tree | 570c78c0915d3608399f003038b66d56e5e29e84 /MediaBrowser.Server.Implementations | |
| parent | edbe28d9fc3091121b7e2323fe42d62a70c9e351 (diff) | |
make controller project portable
Diffstat (limited to 'MediaBrowser.Server.Implementations')
87 files changed, 784 insertions, 429 deletions
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index 59ad0d491..ffb9c96e7 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -23,10 +23,12 @@ 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 6e6d551d1..769b7821a 100644 --- a/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs +++ b/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs @@ -11,7 +11,9 @@ using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; -using CommonIO; +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/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..999634a92 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; @@ -24,6 +22,8 @@ using MediaBrowser.Common.Net; using MediaBrowser.Common.Security; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Services; +using ServiceStack.Api.Swagger; namespace MediaBrowser.Server.Implementations.HttpServer { @@ -100,7 +100,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")); @@ -171,7 +170,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 +182,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); @@ -569,28 +580,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/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..7d4d0a968 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/SwaggerService.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/SwaggerService.cs @@ -1,7 +1,7 @@ using MediaBrowser.Controller; using MediaBrowser.Controller.Net; -using ServiceStack.Web; using System.IO; +using MediaBrowser.Model.Services; namespace MediaBrowser.Server.Implementations.HttpServer { 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 86fc45dfd..72a63c547 100644 --- a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs +++ b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs @@ -11,7 +11,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; using MediaBrowser.Model.Globalization; 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/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 1ea838923..7b88ccf64 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -25,13 +25,15 @@ 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; 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 2f4ff26cd..0b1878c06 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -10,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 @@ -80,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); } @@ -106,6 +109,15 @@ 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); + } + /// <summary> /// Gets the cultures. /// </summary> diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 2024cf9f6..e58c1b3a3 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -42,10 +42,6 @@ <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.58\lib\portable-net46+win10\Emby.XmlTv.dll</HintPath> <Private>True</Private> @@ -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" /> 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 faba6756d..22cb4e86a 100644 --- a/MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs +++ b/MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs @@ -15,7 +15,9 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Xml; -using CommonIO; +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/Persistence/CleanDatabaseScheduledTask.cs b/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs index 2ad0c251a..a3531b9a5 100644 --- a/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs @@ -12,9 +12,11 @@ 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.Net; using MediaBrowser.Model.Globalization; diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index e6512f4df..bc62516c7 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -1140,7 +1140,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]); + } } } 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/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/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/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/packages.config b/MediaBrowser.Server.Implementations/packages.config index 163d7ffde..8c2cd1592 100644 --- a/MediaBrowser.Server.Implementations/packages.config +++ b/MediaBrowser.Server.Implementations/packages.config @@ -1,6 +1,5 @@ <?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.58" targetFramework="net46" />
<package id="ini-parser" version="2.3.0" targetFramework="net45" />
<package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" />
|
