mirror of https://github.com/jellyfin/jellyfin.git
avoid buffering http responses
This commit is contained in:
parent
83606d82d5
commit
a69ca6c55b
|
@ -7,6 +7,8 @@ using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
using MediaBrowser.Controller.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Api.Dlna
|
namespace MediaBrowser.Api.Dlna
|
||||||
{
|
{
|
||||||
|
@ -109,13 +111,15 @@ namespace MediaBrowser.Api.Dlna
|
||||||
private readonly IMediaReceiverRegistrar _mediaReceiverRegistrar;
|
private readonly IMediaReceiverRegistrar _mediaReceiverRegistrar;
|
||||||
|
|
||||||
private const string XMLContentType = "text/xml; charset=UTF-8";
|
private const string XMLContentType = "text/xml; charset=UTF-8";
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
public DlnaServerService(IDlnaManager dlnaManager, IContentDirectory contentDirectory, IConnectionManager connectionManager, IMediaReceiverRegistrar mediaReceiverRegistrar)
|
public DlnaServerService(IDlnaManager dlnaManager, IContentDirectory contentDirectory, IConnectionManager connectionManager, IMediaReceiverRegistrar mediaReceiverRegistrar, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
_dlnaManager = dlnaManager;
|
_dlnaManager = dlnaManager;
|
||||||
_contentDirectory = contentDirectory;
|
_contentDirectory = contentDirectory;
|
||||||
_connectionManager = connectionManager;
|
_connectionManager = connectionManager;
|
||||||
_mediaReceiverRegistrar = mediaReceiverRegistrar;
|
_mediaReceiverRegistrar = mediaReceiverRegistrar;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Get(GetDescriptionXml request)
|
public object Get(GetDescriptionXml request)
|
||||||
|
@ -201,7 +205,7 @@ namespace MediaBrowser.Api.Dlna
|
||||||
{
|
{
|
||||||
using (var response = _dlnaManager.GetIcon(request.Filename))
|
using (var response = _dlnaManager.GetIcon(request.Filename))
|
||||||
{
|
{
|
||||||
using (var ms = new MemoryStream())
|
using (var ms = _memoryStreamProvider.CreateNew())
|
||||||
{
|
{
|
||||||
response.Stream.CopyTo(ms);
|
response.Stream.CopyTo(ms);
|
||||||
|
|
||||||
|
|
|
@ -273,7 +273,8 @@ namespace MediaBrowser.Api.Images
|
||||||
{
|
{
|
||||||
var result = await _httpClient.GetResponse(new HttpRequestOptions
|
var result = await _httpClient.GetResponse(new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url
|
Url = url,
|
||||||
|
BufferContent = false
|
||||||
|
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
|
|
||||||
|
|
|
@ -811,7 +811,8 @@ namespace MediaBrowser.Api.LiveTv
|
||||||
|
|
||||||
var response = await _httpClient.Get(new HttpRequestOptions
|
var response = await _httpClient.Get(new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = "https://json.schedulesdirect.org/20141201/available/countries"
|
Url = "https://json.schedulesdirect.org/20141201/available/countries",
|
||||||
|
BufferContent = false
|
||||||
|
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
|
|
||||||
|
|
|
@ -2469,7 +2469,8 @@ namespace MediaBrowser.Api.Playback
|
||||||
Url = "https://mb3admin.com/admin/service/transcoding/report",
|
Url = "https://mb3admin.com/admin/service/transcoding/report",
|
||||||
CancellationToken = CancellationToken.None,
|
CancellationToken = CancellationToken.None,
|
||||||
LogRequest = false,
|
LogRequest = false,
|
||||||
LogErrors = false
|
LogErrors = false,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
options.RequestContent = JsonSerializer.SerializeToString(dict);
|
options.RequestContent = JsonSerializer.SerializeToString(dict);
|
||||||
options.RequestContentType = "application/json";
|
options.RequestContentType = "application/json";
|
||||||
|
|
|
@ -30,6 +30,7 @@ using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using CommonIO;
|
using CommonIO;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Common.Implementations
|
namespace MediaBrowser.Common.Implementations
|
||||||
{
|
{
|
||||||
|
@ -192,6 +193,8 @@ namespace MediaBrowser.Common.Implementations
|
||||||
get { return Environment.OSVersion.VersionString; }
|
get { return Environment.OSVersion.VersionString; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IMemoryStreamProvider MemoryStreamProvider { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="BaseApplicationHost{TApplicationPathsType}"/> class.
|
/// Initializes a new instance of the <see cref="BaseApplicationHost{TApplicationPathsType}"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -231,6 +234,8 @@ namespace MediaBrowser.Common.Implementations
|
||||||
|
|
||||||
JsonSerializer = CreateJsonSerializer();
|
JsonSerializer = CreateJsonSerializer();
|
||||||
|
|
||||||
|
MemoryStreamProvider = new MemoryStreamProvider();
|
||||||
|
|
||||||
OnLoggerLoaded(true);
|
OnLoggerLoaded(true);
|
||||||
LogManager.LoggerLoaded += (s, e) => OnLoggerLoaded(false);
|
LogManager.LoggerLoaded += (s, e) => OnLoggerLoaded(false);
|
||||||
|
|
||||||
|
@ -456,6 +461,7 @@ namespace MediaBrowser.Common.Implementations
|
||||||
|
|
||||||
RegisterSingleInstance(JsonSerializer);
|
RegisterSingleInstance(JsonSerializer);
|
||||||
RegisterSingleInstance(XmlSerializer);
|
RegisterSingleInstance(XmlSerializer);
|
||||||
|
RegisterSingleInstance(MemoryStreamProvider);
|
||||||
|
|
||||||
RegisterSingleInstance(LogManager);
|
RegisterSingleInstance(LogManager);
|
||||||
RegisterSingleInstance(Logger);
|
RegisterSingleInstance(Logger);
|
||||||
|
@ -464,7 +470,7 @@ namespace MediaBrowser.Common.Implementations
|
||||||
|
|
||||||
RegisterSingleInstance(FileSystemManager);
|
RegisterSingleInstance(FileSystemManager);
|
||||||
|
|
||||||
HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, LogManager.GetLogger("HttpClient"), FileSystemManager);
|
HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, LogManager.GetLogger("HttpClient"), FileSystemManager, MemoryStreamProvider);
|
||||||
RegisterSingleInstance(HttpClient);
|
RegisterSingleInstance(HttpClient);
|
||||||
|
|
||||||
NetworkManager = CreateNetworkManager(LogManager.GetLogger("NetworkManager"));
|
NetworkManager = CreateNetworkManager(LogManager.GetLogger("NetworkManager"));
|
||||||
|
|
|
@ -42,6 +42,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
private readonly IApplicationPaths _appPaths;
|
private readonly IApplicationPaths _appPaths;
|
||||||
|
|
||||||
private readonly IFileSystem _fileSystem;
|
private readonly IFileSystem _fileSystem;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="HttpClientManager" /> class.
|
/// Initializes a new instance of the <see cref="HttpClientManager" /> class.
|
||||||
|
@ -52,7 +53,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
/// <exception cref="System.ArgumentNullException">appPaths
|
/// <exception cref="System.ArgumentNullException">appPaths
|
||||||
/// or
|
/// or
|
||||||
/// logger</exception>
|
/// logger</exception>
|
||||||
public HttpClientManager(IApplicationPaths appPaths, ILogger logger, IFileSystem fileSystem)
|
public HttpClientManager(IApplicationPaths appPaths, ILogger logger, IFileSystem fileSystem, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
if (appPaths == null)
|
if (appPaths == null)
|
||||||
{
|
{
|
||||||
|
@ -65,6 +66,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
|
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_fileSystem = fileSystem;
|
_fileSystem = fileSystem;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
_appPaths = appPaths;
|
_appPaths = appPaths;
|
||||||
|
|
||||||
// http://stackoverflow.com/questions/566437/http-post-returns-the-error-417-expectation-failed-c
|
// http://stackoverflow.com/questions/566437/http-post-returns-the-error-417-expectation-failed-c
|
||||||
|
@ -269,6 +271,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
Url = url,
|
Url = url,
|
||||||
ResourcePool = resourcePool,
|
ResourcePool = resourcePool,
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
|
BufferContent = resourcePool != null
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,7 +332,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
{
|
{
|
||||||
using (var stream = _fileSystem.GetFileStream(responseCachePath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
|
using (var stream = _fileSystem.GetFileStream(responseCachePath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
|
||||||
{
|
{
|
||||||
var memoryStream = new MemoryStream();
|
var memoryStream = _memoryStreamProvider.CreateNew();
|
||||||
|
|
||||||
await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
||||||
memoryStream.Position = 0;
|
memoryStream.Position = 0;
|
||||||
|
@ -363,7 +366,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
|
|
||||||
using (var responseStream = response.Content)
|
using (var responseStream = response.Content)
|
||||||
{
|
{
|
||||||
var memoryStream = new MemoryStream();
|
var memoryStream = _memoryStreamProvider.CreateNew();
|
||||||
await responseStream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
await responseStream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
||||||
memoryStream.Position = 0;
|
memoryStream.Position = 0;
|
||||||
|
|
||||||
|
@ -455,7 +458,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
|
|
||||||
using (var stream = httpResponse.GetResponseStream())
|
using (var stream = httpResponse.GetResponseStream())
|
||||||
{
|
{
|
||||||
var memoryStream = new MemoryStream();
|
var memoryStream = _memoryStreamProvider.CreateNew();
|
||||||
|
|
||||||
await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
||||||
|
|
||||||
|
@ -550,7 +553,8 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
ResourcePool = resourcePool,
|
ResourcePool = resourcePool,
|
||||||
CancellationToken = cancellationToken
|
CancellationToken = cancellationToken,
|
||||||
|
BufferContent = resourcePool != null
|
||||||
|
|
||||||
}, postData);
|
}, postData);
|
||||||
}
|
}
|
||||||
|
@ -560,7 +564,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="options">The options.</param>
|
/// <param name="options">The options.</param>
|
||||||
/// <returns>Task{System.String}.</returns>
|
/// <returns>Task{System.String}.</returns>
|
||||||
/// <exception cref="System.ArgumentNullException">progress</exception>
|
|
||||||
public async Task<string> GetTempFile(HttpRequestOptions options)
|
public async Task<string> GetTempFile(HttpRequestOptions options)
|
||||||
{
|
{
|
||||||
var response = await GetTempFileResponse(options).ConfigureAwait(false);
|
var response = await GetTempFileResponse(options).ConfigureAwait(false);
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
using Microsoft.IO;
|
||||||
|
|
||||||
|
namespace MediaBrowser.Common.Implementations.IO
|
||||||
|
{
|
||||||
|
public class MemoryStreamProvider : IMemoryStreamProvider
|
||||||
|
{
|
||||||
|
readonly RecyclableMemoryStreamManager _manager = new RecyclableMemoryStreamManager();
|
||||||
|
|
||||||
|
public MemoryStream CreateNew()
|
||||||
|
{
|
||||||
|
return _manager.GetStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MemoryStream CreateNew(int capacity)
|
||||||
|
{
|
||||||
|
return _manager.GetStream("RecyclableMemoryStream", capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MemoryStream CreateNew(byte[] buffer)
|
||||||
|
{
|
||||||
|
return _manager.GetStream("RecyclableMemoryStream", buffer, 0, buffer.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -72,6 +72,11 @@ namespace MediaBrowser.Common.Implementations.Logging
|
||||||
/// <param name="paramList">The param list.</param>
|
/// <param name="paramList">The param list.</param>
|
||||||
public void Debug(string message, params object[] paramList)
|
public void Debug(string message, params object[] paramList)
|
||||||
{
|
{
|
||||||
|
if (_logManager.LogSeverity == LogSeverity.Info)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_logger.Debug(message, paramList);
|
_logger.Debug(message, paramList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,6 +142,11 @@ namespace MediaBrowser.Common.Implementations.Logging
|
||||||
/// <param name="additionalContent">Content of the additional.</param>
|
/// <param name="additionalContent">Content of the additional.</param>
|
||||||
public void LogMultiline(string message, LogSeverity severity, StringBuilder additionalContent)
|
public void LogMultiline(string message, LogSeverity severity, StringBuilder additionalContent)
|
||||||
{
|
{
|
||||||
|
if (severity == LogSeverity.Debug && _logManager.LogSeverity == LogSeverity.Info)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
additionalContent.Insert(0, message + Environment.NewLine);
|
additionalContent.Insert(0, message + Environment.NewLine);
|
||||||
|
|
||||||
const char tabChar = '\t';
|
const char tabChar = '\t';
|
||||||
|
|
|
@ -51,6 +51,10 @@
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\packages\CommonIO.1.0.0.9\lib\net45\CommonIO.dll</HintPath>
|
<HintPath>..\packages\CommonIO.1.0.0.9\lib\net45\CommonIO.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.IO.RecyclableMemoryStream, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.1.1.0.0\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
<Reference Include="MoreLinq">
|
<Reference Include="MoreLinq">
|
||||||
<HintPath>..\packages\morelinq.1.4.0\lib\net35\MoreLinq.dll</HintPath>
|
<HintPath>..\packages\morelinq.1.4.0\lib\net35\MoreLinq.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -93,6 +97,7 @@
|
||||||
<Compile Include="HttpClientManager\HttpClientInfo.cs" />
|
<Compile Include="HttpClientManager\HttpClientInfo.cs" />
|
||||||
<Compile Include="HttpClientManager\HttpClientManager.cs" />
|
<Compile Include="HttpClientManager\HttpClientManager.cs" />
|
||||||
<Compile Include="IO\IsoManager.cs" />
|
<Compile Include="IO\IsoManager.cs" />
|
||||||
|
<Compile Include="IO\MemoryStreamProvider.cs" />
|
||||||
<Compile Include="Logging\LogHelper.cs" />
|
<Compile Include="Logging\LogHelper.cs" />
|
||||||
<Compile Include="Logging\NLogger.cs" />
|
<Compile Include="Logging\NLogger.cs" />
|
||||||
<Compile Include="Logging\NlogManager.cs" />
|
<Compile Include="Logging\NlogManager.cs" />
|
||||||
|
|
|
@ -169,7 +169,8 @@ namespace MediaBrowser.Common.Implementations.Security
|
||||||
var options = new HttpRequestOptions()
|
var options = new HttpRequestOptions()
|
||||||
{
|
{
|
||||||
Url = AppstoreRegUrl,
|
Url = AppstoreRegUrl,
|
||||||
CancellationToken = CancellationToken.None
|
CancellationToken = CancellationToken.None,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
options.RequestHeaders.Add("X-Emby-Token", _appHost.SystemId);
|
options.RequestHeaders.Add("X-Emby-Token", _appHost.SystemId);
|
||||||
options.RequestContent = parameters;
|
options.RequestContent = parameters;
|
||||||
|
@ -269,7 +270,8 @@ namespace MediaBrowser.Common.Implementations.Security
|
||||||
Url = MBValidateUrl,
|
Url = MBValidateUrl,
|
||||||
|
|
||||||
// Seeing block length errors
|
// Seeing block length errors
|
||||||
EnableHttpCompression = false
|
EnableHttpCompression = false,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.SetPostData(data);
|
options.SetPostData(data);
|
||||||
|
|
|
@ -30,7 +30,8 @@ namespace MediaBrowser.Common.Implementations.Updates
|
||||||
Url = url,
|
Url = url,
|
||||||
EnableKeepAlive = false,
|
EnableKeepAlive = false,
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
UserAgent = "Emby/3.0"
|
UserAgent = "Emby/3.0",
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
if (cacheLength.Ticks > 0)
|
if (cacheLength.Ticks > 0)
|
||||||
|
@ -105,7 +106,8 @@ namespace MediaBrowser.Common.Implementations.Updates
|
||||||
Url = url,
|
Url = url,
|
||||||
EnableKeepAlive = false,
|
EnableKeepAlive = false,
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
UserAgent = "Emby/3.0"
|
UserAgent = "Emby/3.0",
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var stream = await _httpClient.Get(options).ConfigureAwait(false))
|
using (var stream = await _httpClient.Get(options).ConfigureAwait(false))
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="CommonIO" version="1.0.0.9" targetFramework="net45" />
|
<package id="CommonIO" version="1.0.0.9" targetFramework="net45" />
|
||||||
|
<package id="Microsoft.IO.RecyclableMemoryStream" version="1.1.0.0" targetFramework="net45" />
|
||||||
<package id="morelinq" version="1.4.0" targetFramework="net45" />
|
<package id="morelinq" version="1.4.0" targetFramework="net45" />
|
||||||
<package id="NLog" version="4.3.8" targetFramework="net45" />
|
<package id="NLog" version="4.3.8" targetFramework="net45" />
|
||||||
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
|
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace MediaBrowser.Common.IO
|
||||||
|
{
|
||||||
|
public interface IMemoryStreamProvider
|
||||||
|
{
|
||||||
|
MemoryStream CreateNew();
|
||||||
|
MemoryStream CreateNew(int capacity);
|
||||||
|
MemoryStream CreateNew(byte[] buffer);
|
||||||
|
}
|
||||||
|
}
|
|
@ -60,6 +60,7 @@
|
||||||
<Compile Include="Extensions\BaseExtensions.cs" />
|
<Compile Include="Extensions\BaseExtensions.cs" />
|
||||||
<Compile Include="Extensions\ResourceNotFoundException.cs" />
|
<Compile Include="Extensions\ResourceNotFoundException.cs" />
|
||||||
<Compile Include="IDependencyContainer.cs" />
|
<Compile Include="IDependencyContainer.cs" />
|
||||||
|
<Compile Include="IO\IMemoryStreamProvider.cs" />
|
||||||
<Compile Include="IO\ProgressStream.cs" />
|
<Compile Include="IO\ProgressStream.cs" />
|
||||||
<Compile Include="IO\StreamDefaults.cs" />
|
<Compile Include="IO\StreamDefaults.cs" />
|
||||||
<Compile Include="Configuration\IApplicationPaths.cs" />
|
<Compile Include="Configuration\IApplicationPaths.cs" />
|
||||||
|
|
|
@ -251,4 +251,9 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
{
|
{
|
||||||
Task<Tuple<MediaSourceInfo, IDirectStreamProvider>> GetChannelStreamWithDirectStreamProvider(string channelId, string streamId, CancellationToken cancellationToken);
|
Task<Tuple<MediaSourceInfo, IDirectStreamProvider>> GetChannelStreamWithDirectStreamProvider(string channelId, string streamId, CancellationToken cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface ISupportsUpdatingDefaults
|
||||||
|
{
|
||||||
|
Task UpdateTimerDefaults(SeriesTimerInfo info, CancellationToken cancellationToken);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,7 +120,7 @@ namespace MediaBrowser.Controller.Net
|
||||||
|
|
||||||
var cancellationTokenSource = new CancellationTokenSource();
|
var cancellationTokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
Logger.Info("{1} Begin transmitting over websocket to {0}", message.Connection.RemoteEndPoint, GetType().Name);
|
Logger.Debug("{1} Begin transmitting over websocket to {0}", message.Connection.RemoteEndPoint, GetType().Name);
|
||||||
|
|
||||||
var timer = SendOnTimer ?
|
var timer = SendOnTimer ?
|
||||||
new Timer(TimerCallback, message.Connection, Timeout.Infinite, Timeout.Infinite) :
|
new Timer(TimerCallback, message.Connection, Timeout.Infinite, Timeout.Infinite) :
|
||||||
|
@ -267,7 +267,7 @@ namespace MediaBrowser.Controller.Net
|
||||||
/// <param name="connection">The connection.</param>
|
/// <param name="connection">The connection.</param>
|
||||||
private void DisposeConnection(Tuple<IWebSocketConnection, CancellationTokenSource, Timer, TStateType, SemaphoreSlim> connection)
|
private void DisposeConnection(Tuple<IWebSocketConnection, CancellationTokenSource, Timer, TStateType, SemaphoreSlim> connection)
|
||||||
{
|
{
|
||||||
Logger.Info("{1} stop transmitting over websocket to {0}", connection.Item1.RemoteEndPoint, GetType().Name);
|
Logger.Debug("{1} stop transmitting over websocket to {0}", connection.Item1.RemoteEndPoint, GetType().Name);
|
||||||
|
|
||||||
var timer = connection.Item3;
|
var timer = connection.Item3;
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,8 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
UserAgent = "Emby",
|
UserAgent = "Emby",
|
||||||
RequestContentType = "text/xml; charset=\"utf-8\"",
|
RequestContentType = "text/xml; charset=\"utf-8\"",
|
||||||
LogErrorResponseBody = true,
|
LogErrorResponseBody = true,
|
||||||
Url = request.ContentDirectoryUrl
|
Url = request.ContentDirectoryUrl,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.RequestHeaders["SOAPACTION"] = "urn:schemas-upnp-org:service:ContentDirectory:1#Browse";
|
options.RequestHeaders["SOAPACTION"] = "urn:schemas-upnp-org:service:ContentDirectory:1#Browse";
|
||||||
|
|
|
@ -141,7 +141,8 @@ namespace MediaBrowser.Dlna.Eventing
|
||||||
{
|
{
|
||||||
RequestContent = builder.ToString(),
|
RequestContent = builder.ToString(),
|
||||||
RequestContentType = "text/xml",
|
RequestContentType = "text/xml",
|
||||||
Url = subscription.CallbackUrl
|
Url = subscription.CallbackUrl,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.RequestHeaders.Add("NT", subscription.NotificationType);
|
options.RequestHeaders.Add("NT", subscription.NotificationType);
|
||||||
|
|
|
@ -133,7 +133,6 @@
|
||||||
<Compile Include="Ssdp\Datagram.cs" />
|
<Compile Include="Ssdp\Datagram.cs" />
|
||||||
<Compile Include="Server\DescriptionXmlBuilder.cs" />
|
<Compile Include="Server\DescriptionXmlBuilder.cs" />
|
||||||
<Compile Include="Ssdp\DeviceDiscovery.cs" />
|
<Compile Include="Ssdp\DeviceDiscovery.cs" />
|
||||||
<Compile Include="Ssdp\SsdpHelper.cs" />
|
|
||||||
<Compile Include="PlayTo\SsdpHttpClient.cs" />
|
<Compile Include="PlayTo\SsdpHttpClient.cs" />
|
||||||
<Compile Include="Common\StateVariable.cs" />
|
<Compile Include="Common\StateVariable.cs" />
|
||||||
<Compile Include="PlayTo\TransportCommands.cs" />
|
<Compile Include="PlayTo\TransportCommands.cs" />
|
||||||
|
|
|
@ -70,7 +70,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
UserAgent = USERAGENT,
|
UserAgent = USERAGENT,
|
||||||
LogErrorResponseBody = true
|
LogErrorResponseBody = true,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.RequestHeaders["HOST"] = ip + ":" + port.ToString(_usCulture);
|
options.RequestHeaders["HOST"] = ip + ":" + port.ToString(_usCulture);
|
||||||
|
@ -87,7 +88,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
UserAgent = USERAGENT,
|
UserAgent = USERAGENT,
|
||||||
LogErrorResponseBody = true
|
LogErrorResponseBody = true,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
|
options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
|
||||||
|
@ -115,7 +117,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
Url = url,
|
Url = url,
|
||||||
UserAgent = USERAGENT,
|
UserAgent = USERAGENT,
|
||||||
LogRequest = logRequest || _config.GetDlnaConfiguration().EnableDebugLog,
|
LogRequest = logRequest || _config.GetDlnaConfiguration().EnableDebugLog,
|
||||||
LogErrorResponseBody = true
|
LogErrorResponseBody = true,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.RequestHeaders["SOAPAction"] = soapAction;
|
options.RequestHeaders["SOAPAction"] = soapAction;
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
using MediaBrowser.Controller.Dlna;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Dlna.Ssdp
|
|
||||||
{
|
|
||||||
public class SsdpHelper
|
|
||||||
{
|
|
||||||
public static SsdpMessageEventArgs ParseSsdpResponse(byte[] data)
|
|
||||||
{
|
|
||||||
using (var ms = new MemoryStream(data))
|
|
||||||
{
|
|
||||||
using (var reader = new StreamReader(ms, Encoding.ASCII))
|
|
||||||
{
|
|
||||||
var proto = (reader.ReadLine() ?? string.Empty).Trim();
|
|
||||||
var method = proto.Split(new[] { ' ' }, 2)[0];
|
|
||||||
var headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
for (var line = reader.ReadLine(); line != null; line = reader.ReadLine())
|
|
||||||
{
|
|
||||||
line = line.Trim();
|
|
||||||
if (string.IsNullOrEmpty(line))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var parts = line.Split(new[] { ':' }, 2);
|
|
||||||
|
|
||||||
if (parts.Length >= 2)
|
|
||||||
{
|
|
||||||
headers[parts[0]] = parts[1].Trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new SsdpMessageEventArgs
|
|
||||||
{
|
|
||||||
Method = method,
|
|
||||||
Headers = headers,
|
|
||||||
Message = data
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -76,7 +76,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
|
|
||||||
public static string GetProbeSizeArgument(bool isDvd)
|
public static string GetProbeSizeArgument(bool isDvd)
|
||||||
{
|
{
|
||||||
return isDvd ? "-probesize 1G -analyzeduration 200M" : string.Empty;
|
return isDvd ? "-probesize 1G -analyzeduration 200M" : " -analyzeduration 2M";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ using CommonIO;
|
||||||
using MediaBrowser.Model.Configuration;
|
using MediaBrowser.Model.Configuration;
|
||||||
using MediaBrowser.Common.Configuration;
|
using MediaBrowser.Common.Configuration;
|
||||||
using MediaBrowser.Common.Extensions;
|
using MediaBrowser.Common.Extensions;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
using MediaBrowser.Common.Net;
|
using MediaBrowser.Common.Net;
|
||||||
|
|
||||||
namespace MediaBrowser.MediaEncoding.Encoder
|
namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
|
@ -79,13 +80,14 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
protected readonly Func<IMediaSourceManager> MediaSourceManager;
|
protected readonly Func<IMediaSourceManager> MediaSourceManager;
|
||||||
private readonly IHttpClient _httpClient;
|
private readonly IHttpClient _httpClient;
|
||||||
private readonly IZipClient _zipClient;
|
private readonly IZipClient _zipClient;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
private readonly List<ProcessWrapper> _runningProcesses = new List<ProcessWrapper>();
|
private readonly List<ProcessWrapper> _runningProcesses = new List<ProcessWrapper>();
|
||||||
private readonly bool _hasExternalEncoder;
|
private readonly bool _hasExternalEncoder;
|
||||||
private string _originalFFMpegPath;
|
private string _originalFFMpegPath;
|
||||||
private string _originalFFProbePath;
|
private string _originalFFProbePath;
|
||||||
|
|
||||||
public MediaEncoder(ILogger logger, IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, bool hasExternalEncoder, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, Func<ISubtitleEncoder> subtitleEncoder, Func<IMediaSourceManager> mediaSourceManager, IHttpClient httpClient, IZipClient zipClient)
|
public MediaEncoder(ILogger logger, IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, bool hasExternalEncoder, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, Func<ISubtitleEncoder> subtitleEncoder, Func<IMediaSourceManager> mediaSourceManager, IHttpClient httpClient, IZipClient zipClient, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_jsonSerializer = jsonSerializer;
|
_jsonSerializer = jsonSerializer;
|
||||||
|
@ -100,6 +102,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
MediaSourceManager = mediaSourceManager;
|
MediaSourceManager = mediaSourceManager;
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
_zipClient = zipClient;
|
_zipClient = zipClient;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
FFProbePath = ffProbePath;
|
FFProbePath = ffProbePath;
|
||||||
FFMpegPath = ffMpegPath;
|
FFMpegPath = ffMpegPath;
|
||||||
_originalFFProbePath = ffProbePath;
|
_originalFFProbePath = ffProbePath;
|
||||||
|
@ -544,7 +547,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var mediaInfo = new ProbeResultNormalizer(_logger, FileSystem).GetMediaInfo(result, videoType, isAudio, primaryPath, protocol);
|
var mediaInfo = new ProbeResultNormalizer(_logger, FileSystem, _memoryStreamProvider).GetMediaInfo(result, videoType, isAudio, primaryPath, protocol);
|
||||||
|
|
||||||
var videoStream = mediaInfo.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video);
|
var videoStream = mediaInfo.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video);
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,8 @@ using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
using CommonIO;
|
using CommonIO;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
using MediaBrowser.Controller.IO;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
using MediaBrowser.Model.MediaInfo;
|
using MediaBrowser.Model.MediaInfo;
|
||||||
|
@ -20,11 +22,13 @@ namespace MediaBrowser.MediaEncoding.Probing
|
||||||
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly IFileSystem _fileSystem;
|
private readonly IFileSystem _fileSystem;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
public ProbeResultNormalizer(ILogger logger, IFileSystem fileSystem)
|
public ProbeResultNormalizer(ILogger logger, IFileSystem fileSystem, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_fileSystem = fileSystem;
|
_fileSystem = fileSystem;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MediaInfo GetMediaInfo(InternalMediaInfoResult data, VideoType videoType, bool isAudio, string path, MediaProtocol protocol)
|
public MediaInfo GetMediaInfo(InternalMediaInfoResult data, VideoType videoType, bool isAudio, string path, MediaProtocol protocol)
|
||||||
|
@ -187,7 +191,7 @@ namespace MediaBrowser.MediaEncoding.Probing
|
||||||
xml = "<?xml version=\"1.0\"?>" + xml;
|
xml = "<?xml version=\"1.0\"?>" + xml;
|
||||||
|
|
||||||
// <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>cast</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>name</key>\n\t\t\t<string>Blender Foundation</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>name</key>\n\t\t\t<string>Janus Bager Kristensen</string>\n\t\t</dict>\n\t</array>\n\t<key>directors</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>name</key>\n\t\t\t<string>Sacha Goedegebure</string>\n\t\t</dict>\n\t</array>\n\t<key>studio</key>\n\t<string>Blender Foundation</string>\n</dict>\n</plist>\n
|
// <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>cast</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>name</key>\n\t\t\t<string>Blender Foundation</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>name</key>\n\t\t\t<string>Janus Bager Kristensen</string>\n\t\t</dict>\n\t</array>\n\t<key>directors</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>name</key>\n\t\t\t<string>Sacha Goedegebure</string>\n\t\t</dict>\n\t</array>\n\t<key>studio</key>\n\t<string>Blender Foundation</string>\n</dict>\n</plist>\n
|
||||||
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
|
using (var stream = _memoryStreamProvider.CreateNew(Encoding.UTF8.GetBytes(xml)))
|
||||||
{
|
{
|
||||||
using (var streamReader = new StreamReader(stream))
|
using (var streamReader = new StreamReader(stream))
|
||||||
{
|
{
|
||||||
|
@ -573,8 +577,7 @@ namespace MediaBrowser.MediaEncoding.Probing
|
||||||
|
|
||||||
private void NormalizeStreamTitle(MediaStream stream)
|
private void NormalizeStreamTitle(MediaStream stream)
|
||||||
{
|
{
|
||||||
if (string.Equals(stream.Title, "sdh", StringComparison.OrdinalIgnoreCase) ||
|
if (string.Equals(stream.Title, "cc", StringComparison.OrdinalIgnoreCase))
|
||||||
string.Equals(stream.Title, "cc", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
{
|
||||||
stream.Title = null;
|
stream.Title = null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,8 @@ using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using CommonIO;
|
using CommonIO;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
using MediaBrowser.Controller.IO;
|
||||||
using UniversalDetector;
|
using UniversalDetector;
|
||||||
|
|
||||||
namespace MediaBrowser.MediaEncoding.Subtitles
|
namespace MediaBrowser.MediaEncoding.Subtitles
|
||||||
|
@ -32,8 +34,9 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
||||||
private readonly IJsonSerializer _json;
|
private readonly IJsonSerializer _json;
|
||||||
private readonly IHttpClient _httpClient;
|
private readonly IHttpClient _httpClient;
|
||||||
private readonly IMediaSourceManager _mediaSourceManager;
|
private readonly IMediaSourceManager _mediaSourceManager;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
public SubtitleEncoder(ILibraryManager libraryManager, ILogger logger, IApplicationPaths appPaths, IFileSystem fileSystem, IMediaEncoder mediaEncoder, IJsonSerializer json, IHttpClient httpClient, IMediaSourceManager mediaSourceManager)
|
public SubtitleEncoder(ILibraryManager libraryManager, ILogger logger, IApplicationPaths appPaths, IFileSystem fileSystem, IMediaEncoder mediaEncoder, IJsonSerializer json, IHttpClient httpClient, IMediaSourceManager mediaSourceManager, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
_libraryManager = libraryManager;
|
_libraryManager = libraryManager;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
@ -43,6 +46,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
||||||
_json = json;
|
_json = json;
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
_mediaSourceManager = mediaSourceManager;
|
_mediaSourceManager = mediaSourceManager;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string SubtitleCachePath
|
private string SubtitleCachePath
|
||||||
|
@ -61,7 +65,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
||||||
bool preserveOriginalTimestamps,
|
bool preserveOriginalTimestamps,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var ms = new MemoryStream();
|
var ms = _memoryStreamProvider.CreateNew();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -202,7 +206,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
||||||
|
|
||||||
var bytes = Encoding.UTF8.GetBytes(text);
|
var bytes = Encoding.UTF8.GetBytes(text);
|
||||||
|
|
||||||
return new MemoryStream(bytes);
|
return _memoryStreamProvider.CreateNew(bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,8 @@ namespace MediaBrowser.Model.System
|
||||||
/// <value>The mac address.</value>
|
/// <value>The mac address.</value>
|
||||||
public string MacAddress { get; set; }
|
public string MacAddress { get; set; }
|
||||||
|
|
||||||
|
public string PackageName { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether this instance has pending restart.
|
/// Gets or sets a value indicating whether this instance has pending restart.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace MediaBrowser.Providers.GameGenres
|
||||||
|
|
||||||
public static string ProviderName
|
public static string ProviderName
|
||||||
{
|
{
|
||||||
get { return "Media Browser Designs"; }
|
get { return "Emby Designs"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Supports(IHasImages item)
|
public bool Supports(IHasImages item)
|
||||||
|
@ -137,7 +137,7 @@ namespace MediaBrowser.Providers.GameGenres
|
||||||
{
|
{
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
Url = url,
|
Url = url,
|
||||||
ResourcePool = GenreImageProvider.ImageDownloadResourcePool
|
BufferContent = false
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,6 @@ namespace MediaBrowser.Providers.Genres
|
||||||
|
|
||||||
private readonly SemaphoreSlim _listResourcePool = new SemaphoreSlim(1, 1);
|
private readonly SemaphoreSlim _listResourcePool = new SemaphoreSlim(1, 1);
|
||||||
|
|
||||||
public static SemaphoreSlim ImageDownloadResourcePool = new SemaphoreSlim(5, 5);
|
|
||||||
|
|
||||||
public GenreImageProvider(IServerConfigurationManager config, IHttpClient httpClient, IFileSystem fileSystem)
|
public GenreImageProvider(IServerConfigurationManager config, IHttpClient httpClient, IFileSystem fileSystem)
|
||||||
{
|
{
|
||||||
_config = config;
|
_config = config;
|
||||||
|
@ -38,7 +36,7 @@ namespace MediaBrowser.Providers.Genres
|
||||||
|
|
||||||
public static string ProviderName
|
public static string ProviderName
|
||||||
{
|
{
|
||||||
get { return "Media Browser Designs"; }
|
get { return "Emby Designs"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Supports(IHasImages item)
|
public bool Supports(IHasImages item)
|
||||||
|
@ -138,7 +136,7 @@ namespace MediaBrowser.Providers.Genres
|
||||||
{
|
{
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
Url = url,
|
Url = url,
|
||||||
ResourcePool = ImageDownloadResourcePool
|
BufferContent = false
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ namespace MediaBrowser.Providers.Manager
|
||||||
private readonly ILibraryMonitor _libraryMonitor;
|
private readonly ILibraryMonitor _libraryMonitor;
|
||||||
private readonly IFileSystem _fileSystem;
|
private readonly IFileSystem _fileSystem;
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="ImageSaver" /> class.
|
/// Initializes a new instance of the <see cref="ImageSaver" /> class.
|
||||||
|
@ -46,12 +47,13 @@ namespace MediaBrowser.Providers.Manager
|
||||||
/// <param name="libraryMonitor">The directory watchers.</param>
|
/// <param name="libraryMonitor">The directory watchers.</param>
|
||||||
/// <param name="fileSystem">The file system.</param>
|
/// <param name="fileSystem">The file system.</param>
|
||||||
/// <param name="logger">The logger.</param>
|
/// <param name="logger">The logger.</param>
|
||||||
public ImageSaver(IServerConfigurationManager config, ILibraryMonitor libraryMonitor, IFileSystem fileSystem, ILogger logger)
|
public ImageSaver(IServerConfigurationManager config, ILibraryMonitor libraryMonitor, IFileSystem fileSystem, ILogger logger, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
_config = config;
|
_config = config;
|
||||||
_libraryMonitor = libraryMonitor;
|
_libraryMonitor = libraryMonitor;
|
||||||
_fileSystem = fileSystem;
|
_fileSystem = fileSystem;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -124,7 +126,7 @@ namespace MediaBrowser.Providers.Manager
|
||||||
var retryPaths = GetSavePaths(item, type, imageIndex, mimeType, false);
|
var retryPaths = GetSavePaths(item, type, imageIndex, mimeType, false);
|
||||||
|
|
||||||
// If there are more than one output paths, the stream will need to be seekable
|
// If there are more than one output paths, the stream will need to be seekable
|
||||||
var memoryStream = new MemoryStream();
|
var memoryStream = _memoryStreamProvider.CreateNew();
|
||||||
using (source)
|
using (source)
|
||||||
{
|
{
|
||||||
await source.CopyToAsync(memoryStream).ConfigureAwait(false);
|
await source.CopyToAsync(memoryStream).ConfigureAwait(false);
|
||||||
|
|
|
@ -20,6 +20,7 @@ using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using CommonIO;
|
using CommonIO;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
using MediaBrowser.Model.Serialization;
|
using MediaBrowser.Model.Serialization;
|
||||||
|
|
||||||
namespace MediaBrowser.Providers.Manager
|
namespace MediaBrowser.Providers.Manager
|
||||||
|
@ -64,6 +65,7 @@ namespace MediaBrowser.Providers.Manager
|
||||||
private IExternalId[] _externalIds;
|
private IExternalId[] _externalIds;
|
||||||
|
|
||||||
private readonly Func<ILibraryManager> _libraryManagerFactory;
|
private readonly Func<ILibraryManager> _libraryManagerFactory;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
|
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
|
||||||
|
@ -73,7 +75,7 @@ namespace MediaBrowser.Providers.Manager
|
||||||
/// <param name="libraryMonitor">The directory watchers.</param>
|
/// <param name="libraryMonitor">The directory watchers.</param>
|
||||||
/// <param name="logManager">The log manager.</param>
|
/// <param name="logManager">The log manager.</param>
|
||||||
/// <param name="fileSystem">The file system.</param>
|
/// <param name="fileSystem">The file system.</param>
|
||||||
public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths, Func<ILibraryManager> libraryManagerFactory, IJsonSerializer json)
|
public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths, Func<ILibraryManager> libraryManagerFactory, IJsonSerializer json, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
_logger = logManager.GetLogger("ProviderManager");
|
_logger = logManager.GetLogger("ProviderManager");
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
|
@ -83,6 +85,7 @@ namespace MediaBrowser.Providers.Manager
|
||||||
_appPaths = appPaths;
|
_appPaths = appPaths;
|
||||||
_libraryManagerFactory = libraryManagerFactory;
|
_libraryManagerFactory = libraryManagerFactory;
|
||||||
_json = json;
|
_json = json;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -142,12 +145,12 @@ namespace MediaBrowser.Providers.Manager
|
||||||
|
|
||||||
public Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken)
|
public Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger).SaveImage(item, source, mimeType, type, imageIndex, cancellationToken);
|
return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, source, mimeType, type, imageIndex, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken)
|
public Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger).SaveImage(item, source, mimeType, type, imageIndex, internalCacheKey, cancellationToken);
|
return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, source, mimeType, type, imageIndex, internalCacheKey, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken)
|
public Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken)
|
||||||
|
@ -159,7 +162,7 @@ namespace MediaBrowser.Providers.Manager
|
||||||
|
|
||||||
var fileStream = _fileSystem.GetFileStream(source, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true);
|
var fileStream = _fileSystem.GetFileStream(source, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true);
|
||||||
|
|
||||||
return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger).SaveImage(item, fileStream, mimeType, type, imageIndex, internalCacheKey, cancellationToken);
|
return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, fileStream, mimeType, type, imageIndex, internalCacheKey, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<RemoteImageInfo>> GetAvailableRemoteImages(IHasImages item, RemoteImageQuery query, CancellationToken cancellationToken)
|
public async Task<IEnumerable<RemoteImageInfo>> GetAvailableRemoteImages(IHasImages item, RemoteImageQuery query, CancellationToken cancellationToken)
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace MediaBrowser.Providers.Studios
|
||||||
|
|
||||||
public static string ProviderName
|
public static string ProviderName
|
||||||
{
|
{
|
||||||
get { return "Media Browser Designs"; }
|
get { return "Emby Designs"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Supports(IHasImages item)
|
public bool Supports(IHasImages item)
|
||||||
|
@ -137,7 +137,7 @@ namespace MediaBrowser.Providers.Studios
|
||||||
{
|
{
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
Url = url,
|
Url = url,
|
||||||
ResourcePool = GenreImageProvider.ImageDownloadResourcePool
|
BufferContent = false
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
using CommonIO;
|
using CommonIO;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Providers.TV
|
namespace MediaBrowser.Providers.TV
|
||||||
{
|
{
|
||||||
|
@ -38,6 +39,7 @@ namespace MediaBrowser.Providers.TV
|
||||||
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
public TvdbSeriesProvider(IZipClient zipClient, IHttpClient httpClient, IFileSystem fileSystem, IServerConfigurationManager config, ILogger logger, ILibraryManager libraryManager)
|
public TvdbSeriesProvider(IZipClient zipClient, IHttpClient httpClient, IFileSystem fileSystem, IServerConfigurationManager config, ILogger logger, ILibraryManager libraryManager)
|
||||||
{
|
{
|
||||||
|
@ -238,7 +240,7 @@ namespace MediaBrowser.Providers.TV
|
||||||
DeleteXmlFiles(seriesDataPath);
|
DeleteXmlFiles(seriesDataPath);
|
||||||
|
|
||||||
// Copy to memory stream because we need a seekable stream
|
// Copy to memory stream because we need a seekable stream
|
||||||
using (var ms = new MemoryStream())
|
using (var ms = _memoryStreamProvider.CreateNew())
|
||||||
{
|
{
|
||||||
await zipStream.CopyToAsync(ms).ConfigureAwait(false);
|
await zipStream.CopyToAsync(ms).ConfigureAwait(false);
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
|
|
||||||
// Seeing block length errors with our server
|
// Seeing block length errors with our server
|
||||||
EnableHttpCompression = false,
|
EnableHttpCompression = false,
|
||||||
PreferIpv4 = preferIpv4
|
PreferIpv4 = preferIpv4,
|
||||||
|
BufferContent = false
|
||||||
|
|
||||||
}).ConfigureAwait(false))
|
}).ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
|
|
|
@ -266,7 +266,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
CancellationToken = CancellationToken.None
|
CancellationToken = CancellationToken.None,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.SetPostData(postData);
|
options.SetPostData(postData);
|
||||||
|
@ -314,7 +315,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
CancellationToken = CancellationToken.None
|
CancellationToken = CancellationToken.None,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.SetPostData(postData);
|
options.SetPostData(postData);
|
||||||
|
@ -464,7 +466,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
CancellationToken = CancellationToken.None
|
CancellationToken = CancellationToken.None,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
var accessToken = Guid.NewGuid().ToString("N");
|
var accessToken = Guid.NewGuid().ToString("N");
|
||||||
|
@ -599,7 +602,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
CancellationToken = CancellationToken.None
|
CancellationToken = CancellationToken.None,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
var accessToken = Guid.NewGuid().ToString("N");
|
var accessToken = Guid.NewGuid().ToString("N");
|
||||||
|
@ -652,7 +656,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
CancellationToken = CancellationToken.None
|
CancellationToken = CancellationToken.None,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
var postData = new Dictionary<string, string>
|
var postData = new Dictionary<string, string>
|
||||||
|
@ -726,7 +731,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
Url = url
|
Url = url,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
SetServerAccessToken(options);
|
SetServerAccessToken(options);
|
||||||
|
@ -790,7 +796,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
CancellationToken = cancellationToken
|
CancellationToken = cancellationToken,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
SetServerAccessToken(options);
|
SetServerAccessToken(options);
|
||||||
|
@ -1078,7 +1085,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
CancellationToken = CancellationToken.None
|
CancellationToken = CancellationToken.None,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
var postData = new Dictionary<string, string>
|
var postData = new Dictionary<string, string>
|
||||||
|
@ -1126,7 +1134,8 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
|
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = GetConnectUrl("user/authenticate")
|
Url = GetConnectUrl("user/authenticate"),
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.SetPostData(new Dictionary<string, string>
|
options.SetPostData(new Dictionary<string, string>
|
||||||
|
|
|
@ -1176,6 +1176,12 @@ namespace MediaBrowser.Server.Implementations.Dto
|
||||||
.Except(foundArtists, new DistinctNameComparer())
|
.Except(foundArtists, new DistinctNameComparer())
|
||||||
.Select(i =>
|
.Select(i =>
|
||||||
{
|
{
|
||||||
|
// This should not be necessary but we're seeing some cases of it
|
||||||
|
if (string.IsNullOrWhiteSpace(i))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
var artist = _libraryManager.GetArtist(i);
|
var artist = _libraryManager.GetArtist(i);
|
||||||
if (artist != null)
|
if (artist != null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -64,7 +64,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||||
EnableHttpCompression = false,
|
EnableHttpCompression = false,
|
||||||
|
|
||||||
LogRequest = false,
|
LogRequest = false,
|
||||||
LogErrors = logErrors
|
LogErrors = logErrors,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.SetPostData(data);
|
options.SetPostData(data);
|
||||||
|
@ -114,7 +115,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||||
EnableHttpCompression = false,
|
EnableHttpCompression = false,
|
||||||
|
|
||||||
LogRequest = false,
|
LogRequest = false,
|
||||||
LogErrors = logErrors
|
LogErrors = logErrors,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
options.SetPostData(data);
|
options.SetPostData(data);
|
||||||
|
|
|
@ -19,6 +19,7 @@ using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
using MediaBrowser.Common.Net;
|
using MediaBrowser.Common.Net;
|
||||||
using MediaBrowser.Common.Security;
|
using MediaBrowser.Common.Security;
|
||||||
using MediaBrowser.Model.Extensions;
|
using MediaBrowser.Model.Extensions;
|
||||||
|
@ -45,16 +46,18 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
|
|
||||||
private readonly IServerConfigurationManager _config;
|
private readonly IServerConfigurationManager _config;
|
||||||
private readonly INetworkManager _networkManager;
|
private readonly INetworkManager _networkManager;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
public HttpListenerHost(IApplicationHost applicationHost,
|
public HttpListenerHost(IApplicationHost applicationHost,
|
||||||
ILogManager logManager,
|
ILogManager logManager,
|
||||||
IServerConfigurationManager config,
|
IServerConfigurationManager config,
|
||||||
string serviceName,
|
string serviceName,
|
||||||
string defaultRedirectPath, INetworkManager networkManager, params Assembly[] assembliesWithServices)
|
string defaultRedirectPath, INetworkManager networkManager, IMemoryStreamProvider memoryStreamProvider, params Assembly[] assembliesWithServices)
|
||||||
: base(serviceName, assembliesWithServices)
|
: base(serviceName, assembliesWithServices)
|
||||||
{
|
{
|
||||||
DefaultRedirectPath = defaultRedirectPath;
|
DefaultRedirectPath = defaultRedirectPath;
|
||||||
_networkManager = networkManager;
|
_networkManager = networkManager;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
_config = config;
|
_config = config;
|
||||||
|
|
||||||
_logger = logManager.GetLogger("HttpServer");
|
_logger = logManager.GetLogger("HttpServer");
|
||||||
|
@ -95,6 +98,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
|
|
||||||
container.Adapter = _containerAdapter;
|
container.Adapter = _containerAdapter;
|
||||||
|
|
||||||
|
Plugins.RemoveAll(x => x is NativeTypesFeature);
|
||||||
Plugins.Add(new SwaggerFeature());
|
Plugins.Add(new SwaggerFeature());
|
||||||
Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization, Range, X-MediaBrowser-Token, X-Emby-Authorization"));
|
Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization, Range, X-MediaBrowser-Token, X-Emby-Authorization"));
|
||||||
|
|
||||||
|
@ -179,7 +183,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
|
|
||||||
private IHttpListener GetListener()
|
private IHttpListener GetListener()
|
||||||
{
|
{
|
||||||
return new WebSocketSharpListener(_logger, CertificatePath);
|
return new WebSocketSharpListener(_logger, CertificatePath, _memoryStreamProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnWebSocketConnecting(WebSocketConnectingEventArgs args)
|
private void OnWebSocketConnecting(WebSocketConnectingEventArgs args)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using MediaBrowser.Common;
|
using MediaBrowser.Common;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
using MediaBrowser.Common.Net;
|
using MediaBrowser.Common.Net;
|
||||||
using MediaBrowser.Controller.Configuration;
|
using MediaBrowser.Controller.Configuration;
|
||||||
using MediaBrowser.Controller.Net;
|
using MediaBrowser.Controller.Net;
|
||||||
|
@ -15,23 +16,18 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates the server.
|
/// Creates the server.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="applicationHost">The application host.</param>
|
|
||||||
/// <param name="logManager">The log manager.</param>
|
|
||||||
/// <param name="config">The configuration.</param>
|
|
||||||
/// <param name="_networkmanager">The _networkmanager.</param>
|
|
||||||
/// <param name="serverName">Name of the server.</param>
|
|
||||||
/// <param name="defaultRedirectpath">The default redirectpath.</param>
|
|
||||||
/// <returns>IHttpServer.</returns>
|
/// <returns>IHttpServer.</returns>
|
||||||
public static IHttpServer CreateServer(IApplicationHost applicationHost,
|
public static IHttpServer CreateServer(IApplicationHost applicationHost,
|
||||||
ILogManager logManager,
|
ILogManager logManager,
|
||||||
IServerConfigurationManager config,
|
IServerConfigurationManager config,
|
||||||
INetworkManager _networkmanager,
|
INetworkManager _networkmanager,
|
||||||
|
IMemoryStreamProvider streamProvider,
|
||||||
string serverName,
|
string serverName,
|
||||||
string defaultRedirectpath)
|
string defaultRedirectpath)
|
||||||
{
|
{
|
||||||
LogManager.LogFactory = new ServerLogFactory(logManager);
|
LogManager.LogFactory = new ServerLogFactory(logManager);
|
||||||
|
|
||||||
return new HttpListenerHost(applicationHost, logManager, config, serverName, defaultRedirectpath, _networkmanager);
|
return new HttpListenerHost(applicationHost, logManager, config, serverName, defaultRedirectpath, _networkmanager, streamProvider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,11 +39,11 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
||||||
if (boundary == null)
|
if (boundary == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
using (var requestStream = GetSubStream(InputStream))
|
using (var requestStream = GetSubStream(InputStream, _memoryStreamProvider))
|
||||||
{
|
{
|
||||||
//DB: 30/01/11 - Hack to get around non-seekable stream and received HTTP request
|
//DB: 30/01/11 - Hack to get around non-seekable stream and received HTTP request
|
||||||
//Not ending with \r\n?
|
//Not ending with \r\n?
|
||||||
var ms = new MemoryStream(32 * 1024);
|
var ms = _memoryStreamProvider.CreateNew(32 * 1024);
|
||||||
await requestStream.CopyToAsync(ms).ConfigureAwait(false);
|
await requestStream.CopyToAsync(ms).ConfigureAwait(false);
|
||||||
|
|
||||||
var input = ms;
|
var input = ms;
|
||||||
|
@ -229,9 +229,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
||||||
|
|
||||||
async Task LoadWwwForm()
|
async Task LoadWwwForm()
|
||||||
{
|
{
|
||||||
using (Stream input = GetSubStream(InputStream))
|
using (Stream input = GetSubStream(InputStream, _memoryStreamProvider))
|
||||||
{
|
{
|
||||||
using (var ms = new MemoryStream())
|
using (var ms = _memoryStreamProvider.CreateNew())
|
||||||
{
|
{
|
||||||
await input.CopyToAsync(ms).ConfigureAwait(false);
|
await input.CopyToAsync(ms).ConfigureAwait(false);
|
||||||
ms.Position = 0;
|
ms.Position = 0;
|
||||||
|
|
|
@ -9,6 +9,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
||||||
{
|
{
|
||||||
|
@ -18,11 +19,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
||||||
|
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly string _certificatePath;
|
private readonly string _certificatePath;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
public WebSocketSharpListener(ILogger logger, string certificatePath)
|
public WebSocketSharpListener(ILogger logger, string certificatePath, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_certificatePath = certificatePath;
|
_certificatePath = certificatePath;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Action<Exception, IRequest> ErrorHandler { get; set; }
|
public Action<Exception, IRequest> ErrorHandler { get; set; }
|
||||||
|
@ -148,7 +151,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
||||||
{
|
{
|
||||||
var operationName = httpContext.Request.GetOperationName();
|
var operationName = httpContext.Request.GetOperationName();
|
||||||
|
|
||||||
var req = new WebSocketSharpRequest(httpContext, operationName, RequestAttributes.None, _logger);
|
var req = new WebSocketSharpRequest(httpContext, operationName, RequestAttributes.None, _logger, _memoryStreamProvider);
|
||||||
req.RequestAttributes = req.GetAttributes();
|
req.RequestAttributes = req.GetAttributes();
|
||||||
|
|
||||||
return req;
|
return req;
|
||||||
|
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Funq;
|
using Funq;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
using ServiceStack;
|
using ServiceStack;
|
||||||
using ServiceStack.Host;
|
using ServiceStack.Host;
|
||||||
|
@ -16,11 +17,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
||||||
public Container Container { get; set; }
|
public Container Container { get; set; }
|
||||||
private readonly HttpListenerRequest request;
|
private readonly HttpListenerRequest request;
|
||||||
private readonly IHttpResponse response;
|
private readonly IHttpResponse response;
|
||||||
|
private IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
public WebSocketSharpRequest(HttpListenerContext httpContext, string operationName, RequestAttributes requestAttributes, ILogger logger)
|
public WebSocketSharpRequest(HttpListenerContext httpContext, string operationName, RequestAttributes requestAttributes, ILogger logger, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
this.OperationName = operationName;
|
this.OperationName = operationName;
|
||||||
this.RequestAttributes = requestAttributes;
|
this.RequestAttributes = requestAttributes;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
this.request = httpContext.Request;
|
this.request = httpContext.Request;
|
||||||
this.response = new WebSocketSharpResponse(logger, httpContext.Response, this);
|
this.response = new WebSocketSharpResponse(logger, httpContext.Response, this);
|
||||||
|
|
||||||
|
@ -403,7 +406,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
bufferedStream = value
|
bufferedStream = value
|
||||||
? bufferedStream ?? new MemoryStream(request.InputStream.ReadFully())
|
? bufferedStream ?? _memoryStreamProvider.CreateNew(request.InputStream.ReadFully())
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -447,7 +450,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Stream GetSubStream(Stream stream)
|
static Stream GetSubStream(Stream stream, IMemoryStreamProvider streamProvider)
|
||||||
{
|
{
|
||||||
if (stream is MemoryStream)
|
if (stream is MemoryStream)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
using ServiceStack;
|
using ServiceStack;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.HttpServer
|
namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
|
@ -17,7 +18,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
private ILogger Logger { get; set; }
|
private ILogger Logger { get; set; }
|
||||||
|
|
||||||
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
|
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the source stream.
|
/// Gets or sets the source stream.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -39,6 +40,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
|
|
||||||
public Action OnComplete { get; set; }
|
public Action OnComplete { get; set; }
|
||||||
public Action OnError { get; set; }
|
public Action OnError { get; set; }
|
||||||
|
private readonly byte[] _bytes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="StreamWriter" /> class.
|
/// Initializes a new instance of the <see cref="StreamWriter" /> class.
|
||||||
|
@ -73,6 +75,17 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
public StreamWriter(byte[] source, string contentType, ILogger logger)
|
public StreamWriter(byte[] source, string contentType, ILogger logger)
|
||||||
: this(new MemoryStream(source), contentType, logger)
|
: this(new MemoryStream(source), contentType, logger)
|
||||||
{
|
{
|
||||||
|
if (string.IsNullOrEmpty(contentType))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("contentType");
|
||||||
|
}
|
||||||
|
|
||||||
|
_bytes = source;
|
||||||
|
Logger = logger;
|
||||||
|
|
||||||
|
Options["Content-Type"] = contentType;
|
||||||
|
|
||||||
|
Options["Content-Length"] = source.Length.ToString(UsCulture);
|
||||||
}
|
}
|
||||||
|
|
||||||
private const int BufferSize = 81920;
|
private const int BufferSize = 81920;
|
||||||
|
@ -85,9 +98,16 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var src = SourceStream)
|
if (_bytes != null)
|
||||||
{
|
{
|
||||||
src.CopyTo(responseStream, BufferSize);
|
responseStream.Write(_bytes, 0, _bytes.Length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
using (var src = SourceStream)
|
||||||
|
{
|
||||||
|
src.CopyTo(responseStream, BufferSize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -114,9 +134,16 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var src = SourceStream)
|
if (_bytes != null)
|
||||||
{
|
{
|
||||||
await src.CopyToAsync(responseStream, BufferSize).ConfigureAwait(false);
|
await responseStream.WriteAsync(_bytes, 0, _bytes.Length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
using (var src = SourceStream)
|
||||||
|
{
|
||||||
|
await src.CopyToAsync(responseStream, BufferSize).ConfigureAwait(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
@ -846,7 +846,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
||||||
Url = ApiUrl + "/lineups/" + info.ListingsId,
|
Url = ApiUrl + "/lineups/" + info.ListingsId,
|
||||||
UserAgent = UserAgent,
|
UserAgent = UserAgent,
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
LogErrorResponseBody = true
|
LogErrorResponseBody = true,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
httpOptions.RequestHeaders["token"] = token;
|
httpOptions.RequestHeaders["token"] = token;
|
||||||
|
|
|
@ -558,7 +558,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<LiveTvProgram> GetProgram(ProgramInfo info, Dictionary<Guid, LiveTvProgram> allExistingPrograms, LiveTvChannel channel, ChannelType channelType, string serviceName, CancellationToken cancellationToken)
|
private Tuple<LiveTvProgram, bool, bool> GetProgram(ProgramInfo info, Dictionary<Guid, LiveTvProgram> allExistingPrograms, LiveTvChannel channel, ChannelType channelType, string serviceName, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var id = _tvDtoService.GetInternalProgramId(serviceName, info.Id);
|
var id = _tvDtoService.GetInternalProgramId(serviceName, info.Id);
|
||||||
|
|
||||||
|
@ -671,13 +671,13 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var isUpdated = false;
|
||||||
if (isNew)
|
if (isNew)
|
||||||
{
|
{
|
||||||
await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
else if (forceUpdate || string.IsNullOrWhiteSpace(info.Etag))
|
else if (forceUpdate || string.IsNullOrWhiteSpace(info.Etag))
|
||||||
{
|
{
|
||||||
await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false);
|
isUpdated = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -687,13 +687,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
if (!string.Equals(etag, item.ExternalEtag, StringComparison.OrdinalIgnoreCase))
|
if (!string.Equals(etag, item.ExternalEtag, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
item.ExternalEtag = etag;
|
item.ExternalEtag = etag;
|
||||||
await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false);
|
isUpdated = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions(_fileSystem));
|
return new Tuple<LiveTvProgram, bool, bool>(item, isNew, isUpdated);
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Guid> CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken)
|
private async Task<Guid> CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken)
|
||||||
|
@ -1289,9 +1287,22 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
|
|
||||||
}).Cast<LiveTvProgram>().ToDictionary(i => i.Id);
|
}).Cast<LiveTvProgram>().ToDictionary(i => i.Id);
|
||||||
|
|
||||||
|
var newPrograms = new List<LiveTvProgram>();
|
||||||
|
var updatedPrograms = new List<LiveTvProgram>();
|
||||||
|
|
||||||
foreach (var program in channelPrograms)
|
foreach (var program in channelPrograms)
|
||||||
{
|
{
|
||||||
var programItem = await GetProgram(program, existingPrograms, currentChannel, currentChannel.ChannelType, service.Name, cancellationToken).ConfigureAwait(false);
|
var programTuple = GetProgram(program, existingPrograms, currentChannel, currentChannel.ChannelType, service.Name, cancellationToken);
|
||||||
|
var programItem = programTuple.Item1;
|
||||||
|
|
||||||
|
if (programTuple.Item2)
|
||||||
|
{
|
||||||
|
newPrograms.Add(programItem);
|
||||||
|
}
|
||||||
|
else if (programTuple.Item3)
|
||||||
|
{
|
||||||
|
updatedPrograms.Add(programItem);
|
||||||
|
}
|
||||||
|
|
||||||
programs.Add(programItem.Id);
|
programs.Add(programItem.Id);
|
||||||
|
|
||||||
|
@ -1321,6 +1332,26 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (newPrograms.Count > 0)
|
||||||
|
{
|
||||||
|
await _libraryManager.CreateItems(newPrograms, cancellationToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Do this in bulk
|
||||||
|
foreach (var program in updatedPrograms)
|
||||||
|
{
|
||||||
|
await _libraryManager.UpdateItem(program, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var program in newPrograms)
|
||||||
|
{
|
||||||
|
_providerManager.QueueRefresh(program.Id, new MetadataRefreshOptions(_fileSystem));
|
||||||
|
}
|
||||||
|
foreach (var program in updatedPrograms)
|
||||||
|
{
|
||||||
|
_providerManager.QueueRefresh(program.Id, new MetadataRefreshOptions(_fileSystem));
|
||||||
|
}
|
||||||
|
|
||||||
currentChannel.IsMovie = isMovie;
|
currentChannel.IsMovie = isMovie;
|
||||||
currentChannel.IsNews = isNews;
|
currentChannel.IsNews = isNews;
|
||||||
currentChannel.IsSports = isSports;
|
currentChannel.IsSports = isSports;
|
||||||
|
|
|
@ -12,6 +12,7 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Model.Dlna;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.LiveTv
|
namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
{
|
{
|
||||||
|
@ -138,7 +139,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await AddMediaInfo(stream, isAudio, cancellationToken).ConfigureAwait(false);
|
await AddMediaInfoInternal(stream, isAudio, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -207,6 +208,85 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task AddMediaInfoInternal(MediaSourceInfo mediaSource, bool isAudio, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var originalRuntime = mediaSource.RunTimeTicks;
|
||||||
|
|
||||||
|
var info = await _mediaEncoder.GetMediaInfo(new MediaInfoRequest
|
||||||
|
{
|
||||||
|
InputPath = mediaSource.Path,
|
||||||
|
Protocol = mediaSource.Protocol,
|
||||||
|
MediaType = isAudio ? DlnaProfileType.Audio : DlnaProfileType.Video,
|
||||||
|
ExtractChapters = false
|
||||||
|
|
||||||
|
}, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
mediaSource.Bitrate = info.Bitrate;
|
||||||
|
mediaSource.Container = info.Container;
|
||||||
|
mediaSource.Formats = info.Formats;
|
||||||
|
mediaSource.MediaStreams = info.MediaStreams;
|
||||||
|
mediaSource.RunTimeTicks = info.RunTimeTicks;
|
||||||
|
mediaSource.Size = info.Size;
|
||||||
|
mediaSource.Timestamp = info.Timestamp;
|
||||||
|
mediaSource.Video3DFormat = info.Video3DFormat;
|
||||||
|
mediaSource.VideoType = info.VideoType;
|
||||||
|
|
||||||
|
mediaSource.DefaultSubtitleStreamIndex = null;
|
||||||
|
|
||||||
|
// Null this out so that it will be treated like a live stream
|
||||||
|
if (!originalRuntime.HasValue)
|
||||||
|
{
|
||||||
|
mediaSource.RunTimeTicks = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var audioStream = mediaSource.MediaStreams.FirstOrDefault(i => i.Type == Model.Entities.MediaStreamType.Audio);
|
||||||
|
|
||||||
|
if (audioStream == null || audioStream.Index == -1)
|
||||||
|
{
|
||||||
|
mediaSource.DefaultAudioStreamIndex = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mediaSource.DefaultAudioStreamIndex = audioStream.Index;
|
||||||
|
}
|
||||||
|
|
||||||
|
var videoStream = mediaSource.MediaStreams.FirstOrDefault(i => i.Type == Model.Entities.MediaStreamType.Video);
|
||||||
|
if (videoStream != null)
|
||||||
|
{
|
||||||
|
if (!videoStream.BitRate.HasValue)
|
||||||
|
{
|
||||||
|
var width = videoStream.Width ?? 1920;
|
||||||
|
|
||||||
|
if (width >= 1900)
|
||||||
|
{
|
||||||
|
videoStream.BitRate = 8000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (width >= 1260)
|
||||||
|
{
|
||||||
|
videoStream.BitRate = 3000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (width >= 700)
|
||||||
|
{
|
||||||
|
videoStream.BitRate = 1000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to estimate this
|
||||||
|
if (!mediaSource.Bitrate.HasValue)
|
||||||
|
{
|
||||||
|
var total = mediaSource.MediaStreams.Select(i => i.BitRate ?? 0).Sum();
|
||||||
|
|
||||||
|
if (total > 0)
|
||||||
|
{
|
||||||
|
mediaSource.Bitrate = total;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public Task CloseMediaSource(string liveStreamId)
|
public Task CloseMediaSource(string liveStreamId)
|
||||||
{
|
{
|
||||||
return _liveTvManager.CloseLiveStream(liveStreamId);
|
return _liveTvManager.CloseLiveStream(liveStreamId);
|
||||||
|
|
|
@ -252,84 +252,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AddMediaInfoInternal(MediaSourceInfo mediaSource, bool isAudio, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
var originalRuntime = mediaSource.RunTimeTicks;
|
|
||||||
|
|
||||||
var info = await MediaEncoder.GetMediaInfo(new MediaInfoRequest
|
|
||||||
{
|
|
||||||
InputPath = mediaSource.Path,
|
|
||||||
Protocol = mediaSource.Protocol,
|
|
||||||
MediaType = isAudio ? DlnaProfileType.Audio : DlnaProfileType.Video,
|
|
||||||
ExtractChapters = false
|
|
||||||
|
|
||||||
}, cancellationToken).ConfigureAwait(false);
|
|
||||||
|
|
||||||
mediaSource.Bitrate = info.Bitrate;
|
|
||||||
mediaSource.Container = info.Container;
|
|
||||||
mediaSource.Formats = info.Formats;
|
|
||||||
mediaSource.MediaStreams = info.MediaStreams;
|
|
||||||
mediaSource.RunTimeTicks = info.RunTimeTicks;
|
|
||||||
mediaSource.Size = info.Size;
|
|
||||||
mediaSource.Timestamp = info.Timestamp;
|
|
||||||
mediaSource.Video3DFormat = info.Video3DFormat;
|
|
||||||
mediaSource.VideoType = info.VideoType;
|
|
||||||
|
|
||||||
mediaSource.DefaultSubtitleStreamIndex = null;
|
|
||||||
|
|
||||||
// Null this out so that it will be treated like a live stream
|
|
||||||
if (!originalRuntime.HasValue)
|
|
||||||
{
|
|
||||||
mediaSource.RunTimeTicks = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var audioStream = mediaSource.MediaStreams.FirstOrDefault(i => i.Type == Model.Entities.MediaStreamType.Audio);
|
|
||||||
|
|
||||||
if (audioStream == null || audioStream.Index == -1)
|
|
||||||
{
|
|
||||||
mediaSource.DefaultAudioStreamIndex = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mediaSource.DefaultAudioStreamIndex = audioStream.Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
var videoStream = mediaSource.MediaStreams.FirstOrDefault(i => i.Type == Model.Entities.MediaStreamType.Video);
|
|
||||||
if (videoStream != null)
|
|
||||||
{
|
|
||||||
if (!videoStream.BitRate.HasValue)
|
|
||||||
{
|
|
||||||
var width = videoStream.Width ?? 1920;
|
|
||||||
|
|
||||||
if (width >= 1900)
|
|
||||||
{
|
|
||||||
videoStream.BitRate = 8000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (width >= 1260)
|
|
||||||
{
|
|
||||||
videoStream.BitRate = 3000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (width >= 700)
|
|
||||||
{
|
|
||||||
videoStream.BitRate = 1000000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to estimate this
|
|
||||||
if (!mediaSource.Bitrate.HasValue)
|
|
||||||
{
|
|
||||||
var total = mediaSource.MediaStreams.Select(i => i.BitRate ?? 0).Sum();
|
|
||||||
|
|
||||||
if (total > 0)
|
|
||||||
{
|
|
||||||
mediaSource.Bitrate = total;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract bool IsValidChannelId(string channelId);
|
protected abstract bool IsValidChannelId(string channelId);
|
||||||
|
|
||||||
protected LiveTvOptions GetConfiguration()
|
protected LiveTvOptions GetConfiguration()
|
||||||
|
|
|
@ -88,7 +88,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
using (var stream = await _httpClient.Get(new HttpRequestOptions
|
using (var stream = await _httpClient.Get(new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = string.Format("{0}/discover.json", url),
|
Url = string.Format("{0}/discover.json", url),
|
||||||
CancellationToken = CancellationToken.None
|
CancellationToken = CancellationToken.None,
|
||||||
|
BufferContent = false
|
||||||
}))
|
}))
|
||||||
{
|
{
|
||||||
var response = _json.DeserializeFromStream<HdHomerunHost.DiscoverResponse>(stream);
|
var response = _json.DeserializeFromStream<HdHomerunHost.DiscoverResponse>(stream);
|
||||||
|
|
|
@ -72,7 +72,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = string.Format("{0}/lineup.json", GetApiUrl(info, false)),
|
Url = string.Format("{0}/lineup.json", GetApiUrl(info, false)),
|
||||||
CancellationToken = cancellationToken
|
CancellationToken = cancellationToken,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
using (var stream = await _httpClient.Get(options))
|
using (var stream = await _httpClient.Get(options))
|
||||||
{
|
{
|
||||||
|
@ -124,7 +125,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
CacheLength = TimeSpan.FromDays(1),
|
CacheLength = TimeSpan.FromDays(1),
|
||||||
CacheMode = CacheMode.Unconditional,
|
CacheMode = CacheMode.Unconditional,
|
||||||
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds)
|
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds),
|
||||||
|
BufferContent = false
|
||||||
}))
|
}))
|
||||||
{
|
{
|
||||||
var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream);
|
var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream);
|
||||||
|
@ -165,7 +167,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
{
|
{
|
||||||
Url = string.Format("{0}/tuners.html", GetApiUrl(info, false)),
|
Url = string.Format("{0}/tuners.html", GetApiUrl(info, false)),
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds)
|
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds),
|
||||||
|
BufferContent = false
|
||||||
}))
|
}))
|
||||||
{
|
{
|
||||||
var tuners = new List<LiveTvTunerInfo>();
|
var tuners = new List<LiveTvTunerInfo>();
|
||||||
|
@ -538,7 +541,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
using (var stream = await _httpClient.Get(new HttpRequestOptions
|
using (var stream = await _httpClient.Get(new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = string.Format("{0}/discover.json", GetApiUrl(info, false)),
|
Url = string.Format("{0}/discover.json", GetApiUrl(info, false)),
|
||||||
CancellationToken = CancellationToken.None
|
CancellationToken = CancellationToken.None,
|
||||||
|
BufferContent = false
|
||||||
}))
|
}))
|
||||||
{
|
{
|
||||||
var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream);
|
var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream);
|
||||||
|
|
|
@ -12,6 +12,7 @@ using MediaBrowser.Model.Logging;
|
||||||
using MediaBrowser.Model.MediaInfo;
|
using MediaBrowser.Model.MediaInfo;
|
||||||
using MediaBrowser.Server.Implementations.LiveTv.EmbyTV;
|
using MediaBrowser.Server.Implementations.LiveTv.EmbyTV;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
{
|
{
|
||||||
|
@ -139,7 +140,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Tuple<Stream, CancellationToken, TaskCompletionSource<bool>>> _additionalStreams = new List<Tuple<Stream, CancellationToken, TaskCompletionSource<bool>>>();
|
private readonly List<Tuple<Stream, CancellationToken, TaskCompletionSource<bool>>> _additionalStreams = new List<Tuple<Stream, CancellationToken, TaskCompletionSource<bool>>>();
|
||||||
|
|
||||||
public Task CopyToAsync(Stream stream, CancellationToken cancellationToken)
|
public Task CopyToAsync(Stream stream, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
@ -186,7 +187,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
{
|
{
|
||||||
await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false);
|
await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
foreach (var additionalStream in _additionalStreams)
|
var additionalStreams = _additionalStreams.ToList();
|
||||||
|
foreach (var additionalStream in additionalStreams)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
@ -196,6 +198,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
_logger.ErrorException("Error writing HDHR data to stream", ex);
|
||||||
|
|
||||||
PopAdditionalStream(additionalStream, ex);
|
PopAdditionalStream(additionalStream, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,7 +81,8 @@ namespace MediaBrowser.Server.Implementations.News
|
||||||
{
|
{
|
||||||
Url = "http://emby.media/community/index.php?/blog/rss/1-media-browser-developers-blog",
|
Url = "http://emby.media/community/index.php?/blog/rss/1-media-browser-developers-blog",
|
||||||
Progress = new Progress<double>(),
|
Progress = new Progress<double>(),
|
||||||
UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.42 Safari/537.36"
|
UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.42 Safari/537.36",
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var stream = await _httpClient.Get(requestOptions).ConfigureAwait(false))
|
using (var stream = await _httpClient.Get(requestOptions).ConfigureAwait(false))
|
||||||
|
|
|
@ -4,6 +4,7 @@ using MediaBrowser.Model.Serialization;
|
||||||
using System;
|
using System;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.Persistence
|
namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
{
|
{
|
||||||
|
@ -51,18 +52,16 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a stream from a DataReader at a given ordinal
|
/// Gets a stream from a DataReader at a given ordinal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="reader">The reader.</param>
|
|
||||||
/// <param name="ordinal">The ordinal.</param>
|
|
||||||
/// <returns>Stream.</returns>
|
/// <returns>Stream.</returns>
|
||||||
/// <exception cref="System.ArgumentNullException">reader</exception>
|
/// <exception cref="System.ArgumentNullException">reader</exception>
|
||||||
public static Stream GetMemoryStream(this IDataReader reader, int ordinal)
|
public static Stream GetMemoryStream(this IDataReader reader, int ordinal, IMemoryStreamProvider streamProvider)
|
||||||
{
|
{
|
||||||
if (reader == null)
|
if (reader == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("reader");
|
throw new ArgumentNullException("reader");
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoryStream = new MemoryStream();
|
var memoryStream = streamProvider.CreateNew();
|
||||||
var num = 0L;
|
var num = 0L;
|
||||||
var array = new byte[4096];
|
var array = new byte[4096];
|
||||||
long bytes;
|
long bytes;
|
||||||
|
@ -132,18 +131,16 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Serializes to bytes.
|
/// Serializes to bytes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="json">The json.</param>
|
|
||||||
/// <param name="obj">The obj.</param>
|
|
||||||
/// <returns>System.Byte[][].</returns>
|
/// <returns>System.Byte[][].</returns>
|
||||||
/// <exception cref="System.ArgumentNullException">obj</exception>
|
/// <exception cref="System.ArgumentNullException">obj</exception>
|
||||||
public static byte[] SerializeToBytes(this IJsonSerializer json, object obj)
|
public static byte[] SerializeToBytes(this IJsonSerializer json, object obj, IMemoryStreamProvider streamProvider)
|
||||||
{
|
{
|
||||||
if (obj == null)
|
if (obj == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("obj");
|
throw new ArgumentNullException("obj");
|
||||||
}
|
}
|
||||||
|
|
||||||
using (var stream = new MemoryStream())
|
using (var stream = streamProvider.CreateNew())
|
||||||
{
|
{
|
||||||
json.SerializeToStream(obj, stream);
|
json.SerializeToStream(obj, stream);
|
||||||
return stream.ToArray();
|
return stream.ToArray();
|
||||||
|
|
|
@ -10,6 +10,7 @@ using System.Data;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.Persistence
|
namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
{
|
{
|
||||||
|
@ -18,10 +19,13 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SqliteDisplayPreferencesRepository : BaseSqliteRepository, IDisplayPreferencesRepository
|
public class SqliteDisplayPreferencesRepository : BaseSqliteRepository, IDisplayPreferencesRepository
|
||||||
{
|
{
|
||||||
public SqliteDisplayPreferencesRepository(ILogManager logManager, IJsonSerializer jsonSerializer, IApplicationPaths appPaths, IDbConnector dbConnector)
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
|
public SqliteDisplayPreferencesRepository(ILogManager logManager, IJsonSerializer jsonSerializer, IApplicationPaths appPaths, IDbConnector dbConnector, IMemoryStreamProvider memoryStreamProvider)
|
||||||
: base(logManager, dbConnector)
|
: base(logManager, dbConnector)
|
||||||
{
|
{
|
||||||
_jsonSerializer = jsonSerializer;
|
_jsonSerializer = jsonSerializer;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
DbFilePath = Path.Combine(appPaths.DataPath, "displaypreferences.db");
|
DbFilePath = Path.Combine(appPaths.DataPath, "displaypreferences.db");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +86,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
var serialized = _jsonSerializer.SerializeToBytes(displayPreferences);
|
var serialized = _jsonSerializer.SerializeToBytes(displayPreferences, _memoryStreamProvider);
|
||||||
|
|
||||||
using (var connection = await CreateConnection().ConfigureAwait(false))
|
using (var connection = await CreateConnection().ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
|
@ -166,7 +170,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
foreach (var displayPreference in displayPreferences)
|
foreach (var displayPreference in displayPreferences)
|
||||||
{
|
{
|
||||||
|
|
||||||
var serialized = _jsonSerializer.SerializeToBytes(displayPreference);
|
var serialized = _jsonSerializer.SerializeToBytes(displayPreference, _memoryStreamProvider);
|
||||||
|
|
||||||
using (var cmd = connection.CreateCommand())
|
using (var cmd = connection.CreateCommand())
|
||||||
{
|
{
|
||||||
|
@ -246,7 +250,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
{
|
{
|
||||||
if (reader.Read())
|
if (reader.Read())
|
||||||
{
|
{
|
||||||
using (var stream = reader.GetMemoryStream(0))
|
using (var stream = reader.GetMemoryStream(0, _memoryStreamProvider))
|
||||||
{
|
{
|
||||||
return _jsonSerializer.DeserializeFromStream<DisplayPreferences>(stream);
|
return _jsonSerializer.DeserializeFromStream<DisplayPreferences>(stream);
|
||||||
}
|
}
|
||||||
|
@ -283,7 +287,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
{
|
{
|
||||||
while (reader.Read())
|
while (reader.Read())
|
||||||
{
|
{
|
||||||
using (var stream = reader.GetMemoryStream(0))
|
using (var stream = reader.GetMemoryStream(0, _memoryStreamProvider))
|
||||||
{
|
{
|
||||||
list.Add(_jsonSerializer.DeserializeFromStream<DisplayPreferences>(stream));
|
list.Add(_jsonSerializer.DeserializeFromStream<DisplayPreferences>(stream));
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MediaBrowser.Common.Extensions;
|
using MediaBrowser.Common.Extensions;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
using MediaBrowser.Controller.Channels;
|
using MediaBrowser.Controller.Channels;
|
||||||
using MediaBrowser.Controller.Configuration;
|
using MediaBrowser.Controller.Configuration;
|
||||||
using MediaBrowser.Controller.Playlists;
|
using MediaBrowser.Controller.Playlists;
|
||||||
|
@ -95,11 +96,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
private IDbCommand _updateInheritedTagsCommand;
|
private IDbCommand _updateInheritedTagsCommand;
|
||||||
|
|
||||||
public const int LatestSchemaVersion = 109;
|
public const int LatestSchemaVersion = 109;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
|
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SqliteItemRepository(IServerConfigurationManager config, IJsonSerializer jsonSerializer, ILogManager logManager, IDbConnector connector)
|
public SqliteItemRepository(IServerConfigurationManager config, IJsonSerializer jsonSerializer, ILogManager logManager, IDbConnector connector, IMemoryStreamProvider memoryStreamProvider)
|
||||||
: base(logManager, connector)
|
: base(logManager, connector)
|
||||||
{
|
{
|
||||||
if (config == null)
|
if (config == null)
|
||||||
|
@ -113,6 +115,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
|
|
||||||
_config = config;
|
_config = config;
|
||||||
_jsonSerializer = jsonSerializer;
|
_jsonSerializer = jsonSerializer;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
|
|
||||||
_criticReviewsPath = Path.Combine(_config.ApplicationPaths.DataPath, "critic-reviews");
|
_criticReviewsPath = Path.Combine(_config.ApplicationPaths.DataPath, "critic-reviews");
|
||||||
DbFilePath = Path.Combine(_config.ApplicationPaths.DataPath, "library.db");
|
DbFilePath = Path.Combine(_config.ApplicationPaths.DataPath, "library.db");
|
||||||
|
@ -724,7 +727,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
|
|
||||||
_saveItemCommand.GetParameter(index++).Value = item.Id;
|
_saveItemCommand.GetParameter(index++).Value = item.Id;
|
||||||
_saveItemCommand.GetParameter(index++).Value = item.GetType().FullName;
|
_saveItemCommand.GetParameter(index++).Value = item.GetType().FullName;
|
||||||
_saveItemCommand.GetParameter(index++).Value = _jsonSerializer.SerializeToBytes(item);
|
_saveItemCommand.GetParameter(index++).Value = _jsonSerializer.SerializeToBytes(item, _memoryStreamProvider);
|
||||||
|
|
||||||
_saveItemCommand.GetParameter(index++).Value = item.Path;
|
_saveItemCommand.GetParameter(index++).Value = item.Path;
|
||||||
|
|
||||||
|
@ -1075,7 +1078,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
|
|
||||||
BaseItem item = null;
|
BaseItem item = null;
|
||||||
|
|
||||||
using (var stream = reader.GetMemoryStream(1))
|
using (var stream = reader.GetMemoryStream(1, _memoryStreamProvider))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,6 +9,7 @@ using System.Data;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.Persistence
|
namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
{
|
{
|
||||||
|
@ -18,10 +19,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
public class SqliteUserRepository : BaseSqliteRepository, IUserRepository
|
public class SqliteUserRepository : BaseSqliteRepository, IUserRepository
|
||||||
{
|
{
|
||||||
private readonly IJsonSerializer _jsonSerializer;
|
private readonly IJsonSerializer _jsonSerializer;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
public SqliteUserRepository(ILogManager logManager, IServerApplicationPaths appPaths, IJsonSerializer jsonSerializer, IDbConnector dbConnector) : base(logManager, dbConnector)
|
public SqliteUserRepository(ILogManager logManager, IServerApplicationPaths appPaths, IJsonSerializer jsonSerializer, IDbConnector dbConnector, IMemoryStreamProvider memoryStreamProvider) : base(logManager, dbConnector)
|
||||||
{
|
{
|
||||||
_jsonSerializer = jsonSerializer;
|
_jsonSerializer = jsonSerializer;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
|
|
||||||
DbFilePath = Path.Combine(appPaths.DataPath, "users.db");
|
DbFilePath = Path.Combine(appPaths.DataPath, "users.db");
|
||||||
}
|
}
|
||||||
|
@ -75,7 +78,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
var serialized = _jsonSerializer.SerializeToBytes(user);
|
var serialized = _jsonSerializer.SerializeToBytes(user, _memoryStreamProvider);
|
||||||
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
@ -150,7 +153,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
{
|
{
|
||||||
var id = reader.GetGuid(0);
|
var id = reader.GetGuid(0);
|
||||||
|
|
||||||
using (var stream = reader.GetMemoryStream(1))
|
using (var stream = reader.GetMemoryStream(1, _memoryStreamProvider))
|
||||||
{
|
{
|
||||||
var user = _jsonSerializer.DeserializeFromStream<User>(stream);
|
var user = _jsonSerializer.DeserializeFromStream<User>(stream);
|
||||||
user.Id = id;
|
user.Id = id;
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace MediaBrowser.Server.Implementations.Playlists
|
||||||
|
|
||||||
public override bool IsVisible(User user)
|
public override bool IsVisible(User user)
|
||||||
{
|
{
|
||||||
return base.IsVisible(user) && GetChildren(user, false).Any();
|
return base.IsVisible(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
|
protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
|
||||||
|
|
|
@ -13,6 +13,7 @@ using System.Linq;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.ServerManager
|
namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
{
|
{
|
||||||
|
@ -72,6 +73,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
private readonly List<IWebSocketListener> _webSocketListeners = new List<IWebSocketListener>();
|
private readonly List<IWebSocketListener> _webSocketListeners = new List<IWebSocketListener>();
|
||||||
|
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="ServerManager" /> class.
|
/// Initializes a new instance of the <see cref="ServerManager" /> class.
|
||||||
|
@ -81,7 +83,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
/// <param name="logger">The logger.</param>
|
/// <param name="logger">The logger.</param>
|
||||||
/// <param name="configurationManager">The configuration manager.</param>
|
/// <param name="configurationManager">The configuration manager.</param>
|
||||||
/// <exception cref="System.ArgumentNullException">applicationHost</exception>
|
/// <exception cref="System.ArgumentNullException">applicationHost</exception>
|
||||||
public ServerManager(IServerApplicationHost applicationHost, IJsonSerializer jsonSerializer, ILogger logger, IServerConfigurationManager configurationManager)
|
public ServerManager(IServerApplicationHost applicationHost, IJsonSerializer jsonSerializer, ILogger logger, IServerConfigurationManager configurationManager, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
if (applicationHost == null)
|
if (applicationHost == null)
|
||||||
{
|
{
|
||||||
|
@ -100,6 +102,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
_jsonSerializer = jsonSerializer;
|
_jsonSerializer = jsonSerializer;
|
||||||
_applicationHost = applicationHost;
|
_applicationHost = applicationHost;
|
||||||
ConfigurationManager = configurationManager;
|
ConfigurationManager = configurationManager;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -150,7 +153,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var connection = new WebSocketConnection(e.WebSocket, e.Endpoint, _jsonSerializer, _logger)
|
var connection = new WebSocketConnection(e.WebSocket, e.Endpoint, _jsonSerializer, _logger, _memoryStreamProvider)
|
||||||
{
|
{
|
||||||
OnReceive = ProcessWebSocketMessageReceived,
|
OnReceive = ProcessWebSocketMessageReceived,
|
||||||
Url = e.Url,
|
Url = e.Url,
|
||||||
|
|
|
@ -9,6 +9,7 @@ using System.Collections.Specialized;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
using UniversalDetector;
|
using UniversalDetector;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.ServerManager
|
namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
|
@ -78,7 +79,8 @@ namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The query string.</value>
|
/// <value>The query string.</value>
|
||||||
public NameValueCollection QueryString { get; set; }
|
public NameValueCollection QueryString { get; set; }
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="WebSocketConnection" /> class.
|
/// Initializes a new instance of the <see cref="WebSocketConnection" /> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -87,7 +89,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
/// <param name="jsonSerializer">The json serializer.</param>
|
/// <param name="jsonSerializer">The json serializer.</param>
|
||||||
/// <param name="logger">The logger.</param>
|
/// <param name="logger">The logger.</param>
|
||||||
/// <exception cref="System.ArgumentNullException">socket</exception>
|
/// <exception cref="System.ArgumentNullException">socket</exception>
|
||||||
public WebSocketConnection(IWebSocket socket, string remoteEndPoint, IJsonSerializer jsonSerializer, ILogger logger)
|
public WebSocketConnection(IWebSocket socket, string remoteEndPoint, IJsonSerializer jsonSerializer, ILogger logger, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
if (socket == null)
|
if (socket == null)
|
||||||
{
|
{
|
||||||
|
@ -113,6 +115,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
_socket.OnReceive = OnReceiveInternal;
|
_socket.OnReceive = OnReceiveInternal;
|
||||||
RemoteEndPoint = remoteEndPoint;
|
RemoteEndPoint = remoteEndPoint;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
|
|
||||||
socket.Closed += socket_Closed;
|
socket.Closed += socket_Closed;
|
||||||
}
|
}
|
||||||
|
@ -149,7 +152,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var ms = new MemoryStream(bytes))
|
using (var ms = _memoryStreamProvider.CreateNew(bytes))
|
||||||
{
|
{
|
||||||
var detector = new CharsetDetector();
|
var detector = new CharsetDetector();
|
||||||
detector.Feed(ms);
|
detector.Feed(ms);
|
||||||
|
|
|
@ -75,7 +75,8 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||||
await _httpClient.Post(new HttpRequestOptions
|
await _httpClient.Post(new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url,
|
Url = url,
|
||||||
CancellationToken = cancellationToken
|
CancellationToken = cancellationToken,
|
||||||
|
BufferContent = false
|
||||||
|
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using CommonIO;
|
using CommonIO;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.Sync
|
namespace MediaBrowser.Server.Implementations.Sync
|
||||||
{
|
{
|
||||||
|
@ -51,6 +52,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
private readonly Func<IMediaSourceManager> _mediaSourceManager;
|
private readonly Func<IMediaSourceManager> _mediaSourceManager;
|
||||||
private readonly IJsonSerializer _json;
|
private readonly IJsonSerializer _json;
|
||||||
private readonly ITaskManager _taskManager;
|
private readonly ITaskManager _taskManager;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
private ISyncProvider[] _providers = { };
|
private ISyncProvider[] _providers = { };
|
||||||
|
|
||||||
|
@ -60,7 +62,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
public event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemUpdated;
|
public event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemUpdated;
|
||||||
public event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemCreated;
|
public event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemCreated;
|
||||||
|
|
||||||
public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IServerApplicationHost appHost, ITVSeriesManager tvSeriesManager, Func<IMediaEncoder> mediaEncoder, IFileSystem fileSystem, Func<ISubtitleEncoder> subtitleEncoder, IConfigurationManager config, IUserDataManager userDataManager, Func<IMediaSourceManager> mediaSourceManager, IJsonSerializer json, ITaskManager taskManager)
|
public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IServerApplicationHost appHost, ITVSeriesManager tvSeriesManager, Func<IMediaEncoder> mediaEncoder, IFileSystem fileSystem, Func<ISubtitleEncoder> subtitleEncoder, IConfigurationManager config, IUserDataManager userDataManager, Func<IMediaSourceManager> mediaSourceManager, IJsonSerializer json, ITaskManager taskManager, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
_libraryManager = libraryManager;
|
_libraryManager = libraryManager;
|
||||||
_repo = repo;
|
_repo = repo;
|
||||||
|
@ -78,6 +80,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
_mediaSourceManager = mediaSourceManager;
|
_mediaSourceManager = mediaSourceManager;
|
||||||
_json = json;
|
_json = json;
|
||||||
_taskManager = taskManager;
|
_taskManager = taskManager;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddParts(IEnumerable<ISyncProvider> providers)
|
public void AddParts(IEnumerable<ISyncProvider> providers)
|
||||||
|
@ -95,7 +98,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
|
|
||||||
public ISyncDataProvider GetDataProvider(IServerSyncProvider provider, SyncTarget target)
|
public ISyncDataProvider GetDataProvider(IServerSyncProvider provider, SyncTarget target)
|
||||||
{
|
{
|
||||||
return _dataProviders.GetOrAdd(target.Id, key => new TargetDataProvider(provider, target, _appHost, _logger, _json, _fileSystem, _config.CommonApplicationPaths));
|
return _dataProviders.GetOrAdd(target.Id, key => new TargetDataProvider(provider, target, _appHost, _logger, _json, _fileSystem, _config.CommonApplicationPaths, _memoryStreamProvider));
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SyncJobCreationResult> CreateJob(SyncJobRequest request)
|
public async Task<SyncJobCreationResult> CreateJob(SyncJobRequest request)
|
||||||
|
|
|
@ -12,6 +12,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using CommonIO;
|
using CommonIO;
|
||||||
using Interfaces.IO;
|
using Interfaces.IO;
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.Sync
|
namespace MediaBrowser.Server.Implementations.Sync
|
||||||
{
|
{
|
||||||
|
@ -28,8 +29,9 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
private readonly IFileSystem _fileSystem;
|
private readonly IFileSystem _fileSystem;
|
||||||
private readonly IApplicationPaths _appPaths;
|
private readonly IApplicationPaths _appPaths;
|
||||||
private readonly IServerApplicationHost _appHost;
|
private readonly IServerApplicationHost _appHost;
|
||||||
|
private readonly IMemoryStreamProvider _memoryStreamProvider;
|
||||||
|
|
||||||
public TargetDataProvider(IServerSyncProvider provider, SyncTarget target, IServerApplicationHost appHost, ILogger logger, IJsonSerializer json, IFileSystem fileSystem, IApplicationPaths appPaths)
|
public TargetDataProvider(IServerSyncProvider provider, SyncTarget target, IServerApplicationHost appHost, ILogger logger, IJsonSerializer json, IFileSystem fileSystem, IApplicationPaths appPaths, IMemoryStreamProvider memoryStreamProvider)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_json = json;
|
_json = json;
|
||||||
|
@ -37,6 +39,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
_target = target;
|
_target = target;
|
||||||
_fileSystem = fileSystem;
|
_fileSystem = fileSystem;
|
||||||
_appPaths = appPaths;
|
_appPaths = appPaths;
|
||||||
|
_memoryStreamProvider = memoryStreamProvider;
|
||||||
_appHost = appHost;
|
_appHost = appHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +93,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
|
|
||||||
private async Task SaveData(List<LocalItem> items, CancellationToken cancellationToken)
|
private async Task SaveData(List<LocalItem> items, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
using (var stream = new MemoryStream())
|
using (var stream = _memoryStreamProvider.CreateNew())
|
||||||
{
|
{
|
||||||
_json.SerializeToStream(items, stream);
|
_json.SerializeToStream(items, stream);
|
||||||
|
|
||||||
|
|
|
@ -436,11 +436,11 @@ namespace MediaBrowser.Server.Startup.Common
|
||||||
|
|
||||||
UserRepository = await GetUserRepository().ConfigureAwait(false);
|
UserRepository = await GetUserRepository().ConfigureAwait(false);
|
||||||
|
|
||||||
var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LogManager, JsonSerializer, ApplicationPaths, NativeApp.GetDbConnector());
|
var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LogManager, JsonSerializer, ApplicationPaths, NativeApp.GetDbConnector(), MemoryStreamProvider);
|
||||||
DisplayPreferencesRepository = displayPreferencesRepo;
|
DisplayPreferencesRepository = displayPreferencesRepo;
|
||||||
RegisterSingleInstance(DisplayPreferencesRepository);
|
RegisterSingleInstance(DisplayPreferencesRepository);
|
||||||
|
|
||||||
var itemRepo = new SqliteItemRepository(ServerConfigurationManager, JsonSerializer, LogManager, NativeApp.GetDbConnector());
|
var itemRepo = new SqliteItemRepository(ServerConfigurationManager, JsonSerializer, LogManager, NativeApp.GetDbConnector(), MemoryStreamProvider);
|
||||||
ItemRepository = itemRepo;
|
ItemRepository = itemRepo;
|
||||||
RegisterSingleInstance(ItemRepository);
|
RegisterSingleInstance(ItemRepository);
|
||||||
|
|
||||||
|
@ -465,17 +465,17 @@ namespace MediaBrowser.Server.Startup.Common
|
||||||
LibraryMonitor = new LibraryMonitor(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager, this);
|
LibraryMonitor = new LibraryMonitor(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager, this);
|
||||||
RegisterSingleInstance(LibraryMonitor);
|
RegisterSingleInstance(LibraryMonitor);
|
||||||
|
|
||||||
ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths, () => LibraryManager, JsonSerializer);
|
ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths, () => LibraryManager, JsonSerializer, MemoryStreamProvider);
|
||||||
RegisterSingleInstance(ProviderManager);
|
RegisterSingleInstance(ProviderManager);
|
||||||
|
|
||||||
RegisterSingleInstance<ISearchEngine>(() => new SearchEngine(LogManager, LibraryManager, UserManager));
|
RegisterSingleInstance<ISearchEngine>(() => new SearchEngine(LogManager, LibraryManager, UserManager));
|
||||||
|
|
||||||
HttpServer = ServerFactory.CreateServer(this, LogManager, ServerConfigurationManager, NetworkManager, "Emby", "web/index.html");
|
HttpServer = ServerFactory.CreateServer(this, LogManager, ServerConfigurationManager, NetworkManager, MemoryStreamProvider, "Emby", "web/index.html");
|
||||||
HttpServer.GlobalResponse = LocalizationManager.GetLocalizedString("StartupEmbyServerIsLoading");
|
HttpServer.GlobalResponse = LocalizationManager.GetLocalizedString("StartupEmbyServerIsLoading");
|
||||||
RegisterSingleInstance(HttpServer, false);
|
RegisterSingleInstance(HttpServer, false);
|
||||||
progress.Report(10);
|
progress.Report(10);
|
||||||
|
|
||||||
ServerManager = new ServerManager(this, JsonSerializer, LogManager.GetLogger("ServerManager"), ServerConfigurationManager);
|
ServerManager = new ServerManager(this, JsonSerializer, LogManager.GetLogger("ServerManager"), ServerConfigurationManager, MemoryStreamProvider);
|
||||||
RegisterSingleInstance(ServerManager);
|
RegisterSingleInstance(ServerManager);
|
||||||
|
|
||||||
var innerProgress = new ActionableProgress<double>();
|
var innerProgress = new ActionableProgress<double>();
|
||||||
|
@ -487,7 +487,7 @@ namespace MediaBrowser.Server.Startup.Common
|
||||||
TVSeriesManager = new TVSeriesManager(UserManager, UserDataManager, LibraryManager, ServerConfigurationManager);
|
TVSeriesManager = new TVSeriesManager(UserManager, UserDataManager, LibraryManager, ServerConfigurationManager);
|
||||||
RegisterSingleInstance(TVSeriesManager);
|
RegisterSingleInstance(TVSeriesManager);
|
||||||
|
|
||||||
SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager"), UserManager, () => DtoService, this, TVSeriesManager, () => MediaEncoder, FileSystemManager, () => SubtitleEncoder, ServerConfigurationManager, UserDataManager, () => MediaSourceManager, JsonSerializer, TaskManager);
|
SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager"), UserManager, () => DtoService, this, TVSeriesManager, () => MediaEncoder, FileSystemManager, () => SubtitleEncoder, ServerConfigurationManager, UserDataManager, () => MediaSourceManager, JsonSerializer, TaskManager, MemoryStreamProvider);
|
||||||
RegisterSingleInstance(SyncManager);
|
RegisterSingleInstance(SyncManager);
|
||||||
|
|
||||||
DtoService = new DtoService(LogManager.GetLogger("DtoService"), LibraryManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager, ProviderManager, () => ChannelManager, SyncManager, this, () => DeviceManager, () => MediaSourceManager, () => LiveTvManager);
|
DtoService = new DtoService(LogManager.GetLogger("DtoService"), LibraryManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager, ProviderManager, () => ChannelManager, SyncManager, this, () => DeviceManager, () => MediaSourceManager, () => LiveTvManager);
|
||||||
|
@ -573,7 +573,7 @@ namespace MediaBrowser.Server.Startup.Common
|
||||||
RegisterSingleInstance<ISessionContext>(new SessionContext(UserManager, authContext, SessionManager));
|
RegisterSingleInstance<ISessionContext>(new SessionContext(UserManager, authContext, SessionManager));
|
||||||
RegisterSingleInstance<IAuthService>(new AuthService(UserManager, authContext, ServerConfigurationManager, ConnectManager, SessionManager, DeviceManager));
|
RegisterSingleInstance<IAuthService>(new AuthService(UserManager, authContext, ServerConfigurationManager, ConnectManager, SessionManager, DeviceManager));
|
||||||
|
|
||||||
SubtitleEncoder = new SubtitleEncoder(LibraryManager, LogManager.GetLogger("SubtitleEncoder"), ApplicationPaths, FileSystemManager, MediaEncoder, JsonSerializer, HttpClient, MediaSourceManager);
|
SubtitleEncoder = new SubtitleEncoder(LibraryManager, LogManager.GetLogger("SubtitleEncoder"), ApplicationPaths, FileSystemManager, MediaEncoder, JsonSerializer, HttpClient, MediaSourceManager, MemoryStreamProvider);
|
||||||
RegisterSingleInstance(SubtitleEncoder);
|
RegisterSingleInstance(SubtitleEncoder);
|
||||||
|
|
||||||
await displayPreferencesRepo.Initialize().ConfigureAwait(false);
|
await displayPreferencesRepo.Initialize().ConfigureAwait(false);
|
||||||
|
@ -665,7 +665,7 @@ namespace MediaBrowser.Server.Startup.Common
|
||||||
() => SubtitleEncoder,
|
() => SubtitleEncoder,
|
||||||
() => MediaSourceManager,
|
() => MediaSourceManager,
|
||||||
HttpClient,
|
HttpClient,
|
||||||
ZipClient);
|
ZipClient, MemoryStreamProvider);
|
||||||
|
|
||||||
MediaEncoder = mediaEncoder;
|
MediaEncoder = mediaEncoder;
|
||||||
RegisterSingleInstance(MediaEncoder);
|
RegisterSingleInstance(MediaEncoder);
|
||||||
|
@ -679,7 +679,7 @@ namespace MediaBrowser.Server.Startup.Common
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var repo = new SqliteUserRepository(LogManager, ApplicationPaths, JsonSerializer, NativeApp.GetDbConnector());
|
var repo = new SqliteUserRepository(LogManager, ApplicationPaths, JsonSerializer, NativeApp.GetDbConnector(), MemoryStreamProvider);
|
||||||
|
|
||||||
await repo.Initialize().ConfigureAwait(false);
|
await repo.Initialize().ConfigureAwait(false);
|
||||||
|
|
||||||
|
@ -1132,7 +1132,8 @@ namespace MediaBrowser.Server.Startup.Common
|
||||||
SupportsLibraryMonitor = SupportsLibraryMonitor,
|
SupportsLibraryMonitor = SupportsLibraryMonitor,
|
||||||
EncoderLocationType = MediaEncoder.EncoderLocationType,
|
EncoderLocationType = MediaEncoder.EncoderLocationType,
|
||||||
SystemArchitecture = NativeApp.Environment.SystemArchitecture,
|
SystemArchitecture = NativeApp.Environment.SystemArchitecture,
|
||||||
SystemUpdateLevel = ConfigurationManager.CommonConfiguration.SystemUpdateLevel
|
SystemUpdateLevel = ConfigurationManager.CommonConfiguration.SystemUpdateLevel,
|
||||||
|
PackageName = _startupOptions.GetOption("package")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1237,7 +1238,8 @@ namespace MediaBrowser.Server.Startup.Common
|
||||||
LogErrorResponseBody = false,
|
LogErrorResponseBody = false,
|
||||||
LogErrors = false,
|
LogErrors = false,
|
||||||
LogRequest = false,
|
LogRequest = false,
|
||||||
TimeoutMs = 30000
|
TimeoutMs = 30000,
|
||||||
|
BufferContent = false
|
||||||
|
|
||||||
}, "POST").ConfigureAwait(false))
|
}, "POST").ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
|
|
|
@ -67,6 +67,9 @@ EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Nat", "Mono.Nat\Mono.Nat.csproj", "{D7453B88-2266-4805-B39B-2B5A2A33E1BA}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Nat", "Mono.Nat\Mono.Nat.csproj", "{D7453B88-2266-4805-B39B-2B5A2A33E1BA}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
|
GlobalSection(Performance) = preSolution
|
||||||
|
HasPerformanceSessions = true
|
||||||
|
EndGlobalSection
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
Debug|Mixed Platforms = Debug|Mixed Platforms
|
Debug|Mixed Platforms = Debug|Mixed Platforms
|
||||||
|
|
|
@ -201,7 +201,8 @@ namespace OpenSubtitlesHandler
|
||||||
// Response parsing will fail with this enabled
|
// Response parsing will fail with this enabled
|
||||||
EnableHttpCompression = false,
|
EnableHttpCompression = false,
|
||||||
|
|
||||||
CancellationToken = cancellationToken
|
CancellationToken = cancellationToken,
|
||||||
|
BufferContent = false
|
||||||
};
|
};
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(options.UserAgent))
|
if (string.IsNullOrEmpty(options.UserAgent))
|
||||||
|
|
Loading…
Reference in New Issue