mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-09-09 04:48:15 +02:00
fixed dlna headers
This commit is contained in:
parent
f0f897e97e
commit
f2261a669e
5 changed files with 82 additions and 146 deletions
|
@ -105,48 +105,12 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
private WebRequest GetMonoRequest(HttpRequestOptions options, string method, bool enableHttpCompression)
|
|
||||||
{
|
|
||||||
var request = (HttpWebRequest)WebRequest.Create(options.Url);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(options.AcceptHeader))
|
|
||||||
{
|
|
||||||
request.Accept = options.AcceptHeader;
|
|
||||||
}
|
|
||||||
|
|
||||||
request.AutomaticDecompression = enableHttpCompression ? DecompressionMethods.Deflate : DecompressionMethods.None;
|
|
||||||
|
|
||||||
request.CachePolicy = options.CachePolicy == Net.HttpRequestCachePolicy.None ?
|
|
||||||
new RequestCachePolicy(RequestCacheLevel.BypassCache) :
|
|
||||||
new RequestCachePolicy(RequestCacheLevel.Revalidate);
|
|
||||||
|
|
||||||
request.ConnectionGroupName = GetHostFromUrl(options.Url);
|
|
||||||
request.KeepAlive = true;
|
|
||||||
request.Method = method;
|
|
||||||
request.Pipelined = true;
|
|
||||||
request.Timeout = 20000;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(options.UserAgent))
|
|
||||||
{
|
|
||||||
request.UserAgent = options.UserAgent;
|
|
||||||
}
|
|
||||||
|
|
||||||
return request;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PropertyInfo _httpBehaviorPropertyInfo;
|
private PropertyInfo _httpBehaviorPropertyInfo;
|
||||||
private WebRequest GetRequest(HttpRequestOptions options, string method, bool enableHttpCompression)
|
private WebRequest GetRequest(HttpRequestOptions options, string method, bool enableHttpCompression)
|
||||||
{
|
{
|
||||||
#if __MonoCS__
|
var request = (HttpWebRequest)WebRequest.Create(options.Url);
|
||||||
return GetMonoRequest(options, method, enableHttpCompression);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
var request = HttpWebRequest.CreateHttp(options.Url);
|
AddRequestHeaders(request, options);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(options.AcceptHeader))
|
|
||||||
{
|
|
||||||
request.Accept = options.AcceptHeader;
|
|
||||||
}
|
|
||||||
|
|
||||||
request.AutomaticDecompression = enableHttpCompression ? DecompressionMethods.Deflate : DecompressionMethods.None;
|
request.AutomaticDecompression = enableHttpCompression ? DecompressionMethods.Deflate : DecompressionMethods.None;
|
||||||
|
|
||||||
|
@ -160,11 +124,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
request.Pipelined = true;
|
request.Pipelined = true;
|
||||||
request.Timeout = 20000;
|
request.Timeout = 20000;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(options.UserAgent))
|
#if !__MonoCS__
|
||||||
{
|
|
||||||
request.UserAgent = options.UserAgent;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is a hack to prevent KeepAlive from getting disabled internally by the HttpWebRequest
|
// This is a hack to prevent KeepAlive from getting disabled internally by the HttpWebRequest
|
||||||
// May need to remove this for mono
|
// May need to remove this for mono
|
||||||
var sp = request.ServicePoint;
|
var sp = request.ServicePoint;
|
||||||
|
@ -173,10 +133,30 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||||
_httpBehaviorPropertyInfo = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
|
_httpBehaviorPropertyInfo = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
|
||||||
}
|
}
|
||||||
_httpBehaviorPropertyInfo.SetValue(sp, (byte)0, null);
|
_httpBehaviorPropertyInfo.SetValue(sp, (byte)0, null);
|
||||||
|
#endif
|
||||||
|
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void AddRequestHeaders(HttpWebRequest request, HttpRequestOptions options)
|
||||||
|
{
|
||||||
|
foreach (var header in options.RequestHeaders.ToList())
|
||||||
|
{
|
||||||
|
if (string.Equals(header.Key, "Accept", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
request.Accept = header.Value;
|
||||||
|
}
|
||||||
|
else if (string.Equals(header.Key, "User-Agent", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
request.UserAgent = header.Value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
request.Headers.Set(header.Key, header.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the response internal.
|
/// Gets the response internal.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -357,18 +357,26 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
return;
|
return;
|
||||||
|
|
||||||
((Timer)sender).Stop();
|
((Timer)sender).Stop();
|
||||||
var hasTrack = await GetPositionInfo().ConfigureAwait(false);
|
|
||||||
|
|
||||||
// TODO: Why make these requests if hasTrack==false?
|
try
|
||||||
if (_count > 4)
|
|
||||||
{
|
{
|
||||||
await GetTransportInfo().ConfigureAwait(false);
|
var hasTrack = await GetPositionInfo().ConfigureAwait(false);
|
||||||
if (!hasTrack)
|
|
||||||
|
// TODO: Why make these requests if hasTrack==false?
|
||||||
|
if (_count > 4)
|
||||||
{
|
{
|
||||||
await GetMediaInfo().ConfigureAwait(false);
|
await GetTransportInfo().ConfigureAwait(false);
|
||||||
|
if (!hasTrack)
|
||||||
|
{
|
||||||
|
await GetMediaInfo().ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
await GetVolume().ConfigureAwait(false);
|
||||||
|
_count = 0;
|
||||||
}
|
}
|
||||||
await GetVolume().ConfigureAwait(false);
|
}
|
||||||
_count = 0;
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.ErrorException("Error updating device info", ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
_count++;
|
_count++;
|
||||||
|
@ -390,18 +398,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
throw new InvalidOperationException("Unable to find service");
|
throw new InvalidOperationException("Unable to find service");
|
||||||
}
|
}
|
||||||
|
|
||||||
XDocument result;
|
var result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
|
||||||
|
.ConfigureAwait(false);
|
||||||
try
|
|
||||||
{
|
|
||||||
result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.ErrorException("Error getting volume info", ex);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == null || result.Document == null)
|
if (result == null || result.Document == null)
|
||||||
return;
|
return;
|
||||||
|
@ -431,18 +429,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
if (service == null)
|
if (service == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
XDocument result;
|
var result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
|
||||||
|
.ConfigureAwait(false);
|
||||||
try
|
|
||||||
{
|
|
||||||
result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.ErrorException("Error getting transport info", ex);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == null || result.Document == null)
|
if (result == null || result.Document == null)
|
||||||
return;
|
return;
|
||||||
|
@ -471,18 +459,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
throw new InvalidOperationException("Unable to find service");
|
throw new InvalidOperationException("Unable to find service");
|
||||||
}
|
}
|
||||||
|
|
||||||
XDocument result;
|
var result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
|
||||||
|
.ConfigureAwait(false);
|
||||||
try
|
|
||||||
{
|
|
||||||
result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.ErrorException("Error getting media info", ex);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == null || result.Document == null)
|
if (result == null || result.Document == null)
|
||||||
return;
|
return;
|
||||||
|
@ -522,18 +500,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
throw new InvalidOperationException("Unable to find service");
|
throw new InvalidOperationException("Unable to find service");
|
||||||
}
|
}
|
||||||
|
|
||||||
XDocument result;
|
var result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
|
||||||
|
.ConfigureAwait(false);
|
||||||
try
|
|
||||||
{
|
|
||||||
result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.ErrorException("Error getting position info", ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == null || result.Document == null)
|
if (result == null || result.Document == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -23,15 +23,15 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly ISessionManager _sessionManager;
|
private readonly ISessionManager _sessionManager;
|
||||||
private readonly IHttpClient _httpClient;
|
private readonly IHttpClient _httpClient;
|
||||||
private User _defualtUser;
|
|
||||||
private readonly CancellationTokenSource _tokenSource;
|
private readonly CancellationTokenSource _tokenSource;
|
||||||
private ConcurrentDictionary<string, DateTime> _locations;
|
private ConcurrentDictionary<string, DateTime> _locations;
|
||||||
|
|
||||||
private readonly IItemRepository _itemRepository;
|
private readonly IItemRepository _itemRepository;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
private readonly INetworkManager _networkManager;
|
private readonly INetworkManager _networkManager;
|
||||||
|
private readonly IUserManager _userManager;
|
||||||
|
|
||||||
public PlayToManager(ILogger logger, ISessionManager sessionManager, IHttpClient httpClient, IItemRepository itemRepository, ILibraryManager libraryManager, INetworkManager networkManager)
|
public PlayToManager(ILogger logger, ISessionManager sessionManager, IHttpClient httpClient, IItemRepository itemRepository, ILibraryManager libraryManager, INetworkManager networkManager, IUserManager userManager)
|
||||||
{
|
{
|
||||||
_locations = new ConcurrentDictionary<string, DateTime>();
|
_locations = new ConcurrentDictionary<string, DateTime>();
|
||||||
_tokenSource = new CancellationTokenSource();
|
_tokenSource = new CancellationTokenSource();
|
||||||
|
@ -42,11 +42,11 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
_itemRepository = itemRepository;
|
_itemRepository = itemRepository;
|
||||||
_libraryManager = libraryManager;
|
_libraryManager = libraryManager;
|
||||||
_networkManager = networkManager;
|
_networkManager = networkManager;
|
||||||
|
_userManager = userManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void Start(User defaultUser)
|
public async void Start()
|
||||||
{
|
{
|
||||||
_defualtUser = defaultUser;
|
|
||||||
_logger.Log(LogSeverity.Info, "PlayTo-Manager starting");
|
_logger.Log(LogSeverity.Info, "PlayTo-Manager starting");
|
||||||
|
|
||||||
_locations = new ConcurrentDictionary<string, DateTime>();
|
_locations = new ConcurrentDictionary<string, DateTime>();
|
||||||
|
@ -216,7 +216,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
var transcodeProfiles = TranscodeSettings.GetProfileSettings(device.Properties);
|
var transcodeProfiles = TranscodeSettings.GetProfileSettings(device.Properties);
|
||||||
|
|
||||||
var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, device.Properties.Name, device.Properties.UUID, device.Properties.DisplayName, uri.OriginalString, _defualtUser)
|
var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, device.Properties.Name, device.Properties.UUID, device.Properties.DisplayName, uri.OriginalString, null)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
var controller = sessionInfo.SessionController as PlayToController;
|
var controller = sessionInfo.SessionController as PlayToController;
|
||||||
|
@ -232,6 +232,23 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const string DefaultUser = "Play To";
|
||||||
|
private async Task<User> GetPlayToUser()
|
||||||
|
{
|
||||||
|
var user = _userManager.Users.FirstOrDefault(u => string.Equals(DefaultUser, u.Name, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
if (user == null)
|
||||||
|
{
|
||||||
|
user = await _userManager.CreateUser(DefaultUser);
|
||||||
|
|
||||||
|
user.Configuration.IsHidden = true;
|
||||||
|
user.Configuration.IsAdministrator = false;
|
||||||
|
user.SaveConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determines if the Uri is valid for further inspection or not.
|
/// Determines if the Uri is valid for further inspection or not.
|
||||||
/// (the limit for reinspection is 5 minutes)
|
/// (the limit for reinspection is 5 minutes)
|
||||||
|
|
|
@ -1,55 +1,26 @@
|
||||||
using MediaBrowser.Common.Net;
|
using MediaBrowser.Common.Net;
|
||||||
using MediaBrowser.Controller.Entities;
|
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
using MediaBrowser.Controller.Persistence;
|
using MediaBrowser.Controller.Persistence;
|
||||||
using MediaBrowser.Controller.Plugins;
|
using MediaBrowser.Controller.Plugins;
|
||||||
using MediaBrowser.Controller.Session;
|
using MediaBrowser.Controller.Session;
|
||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Dlna.PlayTo
|
namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
public class PlayToServerEntryPoint : IServerEntryPoint
|
public class PlayToServerEntryPoint : IServerEntryPoint
|
||||||
{
|
{
|
||||||
const string DefaultUser = "Play To";
|
|
||||||
|
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
|
|
||||||
private readonly IUserManager _userManager;
|
|
||||||
private readonly PlayToManager _manager;
|
private readonly PlayToManager _manager;
|
||||||
|
|
||||||
public PlayToServerEntryPoint(ILogManager logManager, ISessionManager sessionManager, IUserManager userManager, IHttpClient httpClient, INetworkManager networkManager, IItemRepository itemRepository, ILibraryManager libraryManager)
|
public PlayToServerEntryPoint(ILogManager logManager, ISessionManager sessionManager, IUserManager userManager, IHttpClient httpClient, INetworkManager networkManager, IItemRepository itemRepository, ILibraryManager libraryManager)
|
||||||
{
|
{
|
||||||
_userManager = userManager;
|
_manager = new PlayToManager(logManager.GetLogger("PlayTo"), sessionManager, httpClient, itemRepository, libraryManager, networkManager, userManager);
|
||||||
|
|
||||||
_manager = new PlayToManager(logManager.GetLogger("PlayTo"), sessionManager, httpClient, itemRepository, libraryManager, networkManager);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public void Run()
|
||||||
/// Creates the defaultuser if needed.
|
|
||||||
/// </summary>
|
|
||||||
private async Task<User> CreateUserIfNeeded()
|
|
||||||
{
|
{
|
||||||
var user = _userManager.Users.FirstOrDefault(u => u.Name == DefaultUser);
|
//_manager.Start();
|
||||||
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
user = await _userManager.CreateUser(DefaultUser);
|
|
||||||
|
|
||||||
user.Configuration.IsHidden = true;
|
|
||||||
user.Configuration.IsAdministrator = false;
|
|
||||||
user.SaveConfiguration();
|
|
||||||
}
|
|
||||||
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async void Run()
|
|
||||||
{
|
|
||||||
//var defaultUser = await CreateUserIfNeeded().ConfigureAwait(false);
|
|
||||||
|
|
||||||
//_manager.Start(defaultUser);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Dispose
|
#region Dispose
|
||||||
|
|
|
@ -44,10 +44,10 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url.ToString()
|
Url = url.ToString(),
|
||||||
|
UserAgent = USERAGENT
|
||||||
};
|
};
|
||||||
|
|
||||||
options.RequestHeaders["UserAgent"] = USERAGENT;
|
|
||||||
options.RequestHeaders["HOST"] = ip + ":" + port;
|
options.RequestHeaders["HOST"] = ip + ":" + port;
|
||||||
options.RequestHeaders["CALLBACK"] = "<" + localIp + ":" + eventport + ">";
|
options.RequestHeaders["CALLBACK"] = "<" + localIp + ":" + eventport + ">";
|
||||||
options.RequestHeaders["NT"] = "upnp:event";
|
options.RequestHeaders["NT"] = "upnp:event";
|
||||||
|
@ -63,10 +63,10 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url.ToString()
|
Url = url.ToString(),
|
||||||
|
UserAgent = USERAGENT
|
||||||
};
|
};
|
||||||
|
|
||||||
options.RequestHeaders["UserAgent"] = USERAGENT;
|
|
||||||
options.RequestHeaders["HOST"] = ip + ":" + port;
|
options.RequestHeaders["HOST"] = ip + ":" + port;
|
||||||
options.RequestHeaders["CALLBACK"] = "<" + localIp + ":" + eventport + ">";
|
options.RequestHeaders["CALLBACK"] = "<" + localIp + ":" + eventport + ">";
|
||||||
options.RequestHeaders["NT"] = "upnp:event";
|
options.RequestHeaders["NT"] = "upnp:event";
|
||||||
|
@ -82,10 +82,10 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url.ToString()
|
Url = url.ToString(),
|
||||||
|
UserAgent = USERAGENT
|
||||||
};
|
};
|
||||||
|
|
||||||
options.RequestHeaders["UserAgent"] = USERAGENT;
|
|
||||||
options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
|
options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
|
||||||
//request.CookieContainer = Container;
|
//request.CookieContainer = Container;
|
||||||
|
|
||||||
|
@ -105,12 +105,12 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
var options = new HttpRequestOptions
|
var options = new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = url.ToString()
|
Url = url.ToString(),
|
||||||
|
UserAgent = USERAGENT
|
||||||
};
|
};
|
||||||
|
|
||||||
options.RequestHeaders["SOAPAction"] = soapAction;
|
options.RequestHeaders["SOAPAction"] = soapAction;
|
||||||
options.RequestHeaders["Pragma"] = "no-cache";
|
options.RequestHeaders["Pragma"] = "no-cache";
|
||||||
options.RequestHeaders["UserAgent"] = USERAGENT;
|
|
||||||
options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
|
options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(header))
|
if (!string.IsNullOrWhiteSpace(header))
|
||||||
|
|
Loading…
Reference in a new issue