mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-07-09 03:04:24 -04:00
Changed selection method
This commit is contained in:
parent
2e01fb3cda
commit
7936ea59eb
@ -1201,11 +1201,25 @@ namespace Emby.Server.Implementations
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public string GetExternalFacingHttpApiUrl()
|
public string GetInterfaceHttpApiUrl()
|
||||||
{
|
{
|
||||||
// Passing an external address cause GetBindInterface to return the externally facing interface on a multi-adapter system.
|
// Published server ends with a /
|
||||||
// LocalNetworkSubnets and LocalNetworkAddresses are used in conjunction with the ip address to help select the best interface.
|
if (!string.IsNullOrEmpty(PublishedServerUrl))
|
||||||
return GetLocalApiUrl(NetManager.GetBindInterface("0.0.0.0", out var _), Uri.UriSchemeHttp, HttpPort);
|
{
|
||||||
|
// Published server ends with a '/', so we need to remove it.
|
||||||
|
return PublishedServerUrl.Trim('/');
|
||||||
|
}
|
||||||
|
|
||||||
|
var bind = NetManager.GetInternalBindAddresses().FirstOrDefault() ?? new IPNetAddress(IPAddress.None);
|
||||||
|
|
||||||
|
string smart = NetManager.GetBindInterface(bind, out var port);
|
||||||
|
// If the smartAPI doesn't start with http then treat it as a host or ip.
|
||||||
|
if (smart.StartsWith("http", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return smart.Trim('/');
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetLocalApiUrl(smart.Trim('/'), null, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
|
@ -1031,7 +1031,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
|||||||
{
|
{
|
||||||
var stream = new MediaSourceInfo
|
var stream = new MediaSourceInfo
|
||||||
{
|
{
|
||||||
EncoderPath = _appHost.GetLoopbackHttpApiUrl() + "/LiveTv/LiveRecordings/" + info.Id + "/stream",
|
EncoderPath = _appHost.GetInterfaceHttpApiUrl() + "/LiveTv/LiveRecordings/" + info.Id + "/stream",
|
||||||
EncoderProtocol = MediaProtocol.Http,
|
EncoderProtocol = MediaProtocol.Http,
|
||||||
Path = info.Path,
|
Path = info.Path,
|
||||||
Protocol = MediaProtocol.File,
|
Protocol = MediaProtocol.File,
|
||||||
|
@ -102,7 +102,7 @@ namespace Emby.Server.Implementations.LiveTv
|
|||||||
// Dummy this up so that direct play checks can still run
|
// Dummy this up so that direct play checks can still run
|
||||||
if (string.IsNullOrEmpty(source.Path) && source.Protocol == MediaProtocol.Http)
|
if (string.IsNullOrEmpty(source.Path) && source.Protocol == MediaProtocol.Http)
|
||||||
{
|
{
|
||||||
source.Path = _appHost.GetExternalFacingHttpApiUrl();
|
source.Path = _appHost.GetInterfaceHttpApiUrl();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +148,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|||||||
// OpenedMediaSource.Path = tempFile;
|
// OpenedMediaSource.Path = tempFile;
|
||||||
// OpenedMediaSource.ReadAtNativeFramerate = true;
|
// OpenedMediaSource.ReadAtNativeFramerate = true;
|
||||||
|
|
||||||
MediaSource.Path = _appHost.GetLoopbackHttpApiUrl() + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
|
MediaSource.Path = _appHost.GetInterfaceHttpApiUrl() + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
|
||||||
MediaSource.Protocol = MediaProtocol.Http;
|
MediaSource.Protocol = MediaProtocol.Http;
|
||||||
// OpenedMediaSource.SupportsDirectPlay = false;
|
// OpenedMediaSource.SupportsDirectPlay = false;
|
||||||
// OpenedMediaSource.SupportsDirectStream = true;
|
// OpenedMediaSource.SupportsDirectStream = true;
|
||||||
|
@ -97,7 +97,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
|
|||||||
// OpenedMediaSource.Path = tempFile;
|
// OpenedMediaSource.Path = tempFile;
|
||||||
// OpenedMediaSource.ReadAtNativeFramerate = true;
|
// OpenedMediaSource.ReadAtNativeFramerate = true;
|
||||||
|
|
||||||
MediaSource.Path = _appHost.GetLoopbackHttpApiUrl() + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
|
MediaSource.Path = _appHost.GetInterfaceHttpApiUrl() + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
|
||||||
MediaSource.Protocol = MediaProtocol.Http;
|
MediaSource.Protocol = MediaProtocol.Http;
|
||||||
|
|
||||||
// OpenedMediaSource.Path = TempFilePath;
|
// OpenedMediaSource.Path = TempFilePath;
|
||||||
|
@ -455,10 +455,10 @@ namespace Jellyfin.Networking.Manager
|
|||||||
}
|
}
|
||||||
|
|
||||||
// No bind address, so return all internal interfaces.
|
// No bind address, so return all internal interfaces.
|
||||||
return CreateCollection(_internalInterfaces.Where(p => !p.IsLoopback()));
|
return CreateCollection(_internalInterfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Collection<IPObject>(_bindAddresses);
|
return new Collection<IPObject>(_bindAddresses.Where(IsInLocalNetwork).ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -481,7 +481,7 @@ namespace Jellyfin.Networking.Manager
|
|||||||
}
|
}
|
||||||
|
|
||||||
// As private addresses can be redefined by Configuration.LocalNetworkAddresses
|
// As private addresses can be redefined by Configuration.LocalNetworkAddresses
|
||||||
return _lanSubnets.ContainsAddress(address) && !_excludedSubnets.ContainsAddress(address);
|
return address.IsLoopback() || (_lanSubnets.ContainsAddress(address) && !_excludedSubnets.ContainsAddress(address));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -647,16 +647,6 @@ namespace Jellyfin.Networking.Manager
|
|||||||
_interfaceAddresses.AddItem(address, false);
|
_interfaceAddresses.AddItem(address, false);
|
||||||
_interfaceNames[parts[2]] = Math.Abs(index);
|
_interfaceNames[parts[2]] = Math.Abs(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsIP4Enabled)
|
|
||||||
{
|
|
||||||
_interfaceAddresses.AddItem(IPNetAddress.IP4Loopback);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IsIP6Enabled)
|
|
||||||
{
|
|
||||||
_interfaceAddresses.AddItem(IPNetAddress.IP6Loopback);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InitialiseLAN(config);
|
InitialiseLAN(config);
|
||||||
@ -990,7 +980,6 @@ namespace Jellyfin.Networking.Manager
|
|||||||
// Read and parse bind addresses and exclusions, removing ones that don't exist.
|
// Read and parse bind addresses and exclusions, removing ones that don't exist.
|
||||||
_bindAddresses = CreateIPCollection(lanAddresses).ThatAreContainedInNetworks(_interfaceAddresses);
|
_bindAddresses = CreateIPCollection(lanAddresses).ThatAreContainedInNetworks(_interfaceAddresses);
|
||||||
_bindExclusions = CreateIPCollection(lanAddresses, true).ThatAreContainedInNetworks(_interfaceAddresses);
|
_bindExclusions = CreateIPCollection(lanAddresses, true).ThatAreContainedInNetworks(_interfaceAddresses);
|
||||||
|
|
||||||
_logger.LogInformation("Using bind addresses: {0}", _bindAddresses.AsString());
|
_logger.LogInformation("Using bind addresses: {0}", _bindAddresses.AsString());
|
||||||
_logger.LogInformation("Using bind exclusions: {0}", _bindExclusions.AsString());
|
_logger.LogInformation("Using bind exclusions: {0}", _bindExclusions.AsString());
|
||||||
}
|
}
|
||||||
@ -1038,17 +1027,14 @@ namespace Jellyfin.Networking.Manager
|
|||||||
// Subnets are the same as the calculated internal interface.
|
// Subnets are the same as the calculated internal interface.
|
||||||
_lanSubnets = new Collection<IPObject>();
|
_lanSubnets = new Collection<IPObject>();
|
||||||
|
|
||||||
// We must listen on loopback for LiveTV to function regardless of the settings.
|
|
||||||
if (IsIP6Enabled)
|
if (IsIP6Enabled)
|
||||||
{
|
{
|
||||||
_lanSubnets.AddItem(IPNetAddress.IP6Loopback);
|
|
||||||
_lanSubnets.AddItem(IPNetAddress.Parse("fc00::/7")); // ULA
|
_lanSubnets.AddItem(IPNetAddress.Parse("fc00::/7")); // ULA
|
||||||
_lanSubnets.AddItem(IPNetAddress.Parse("fe80::/10")); // Site local
|
_lanSubnets.AddItem(IPNetAddress.Parse("fe80::/10")); // Site local
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsIP4Enabled)
|
if (IsIP4Enabled)
|
||||||
{
|
{
|
||||||
_lanSubnets.AddItem(IPNetAddress.IP4Loopback);
|
|
||||||
_lanSubnets.AddItem(IPNetAddress.Parse("10.0.0.0/8"));
|
_lanSubnets.AddItem(IPNetAddress.Parse("10.0.0.0/8"));
|
||||||
_lanSubnets.AddItem(IPNetAddress.Parse("172.16.0.0/12"));
|
_lanSubnets.AddItem(IPNetAddress.Parse("172.16.0.0/12"));
|
||||||
_lanSubnets.AddItem(IPNetAddress.Parse("192.168.0.0/16"));
|
_lanSubnets.AddItem(IPNetAddress.Parse("192.168.0.0/16"));
|
||||||
@ -1056,17 +1042,6 @@ namespace Jellyfin.Networking.Manager
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// We must listen on loopback for LiveTV to function regardless of the settings.
|
|
||||||
if (IsIP6Enabled)
|
|
||||||
{
|
|
||||||
_lanSubnets.AddItem(IPNetAddress.IP6Loopback);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IsIP4Enabled)
|
|
||||||
{
|
|
||||||
_lanSubnets.AddItem(IPNetAddress.IP4Loopback);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Internal interfaces must be private, not excluded and part of the LocalNetworkSubnet.
|
// Internal interfaces must be private, not excluded and part of the LocalNetworkSubnet.
|
||||||
_internalInterfaces = CreateCollection(_interfaceAddresses.Where(i => IsInLocalNetwork(i)));
|
_internalInterfaces = CreateCollection(_interfaceAddresses.Where(i => IsInLocalNetwork(i)));
|
||||||
}
|
}
|
||||||
|
@ -88,11 +88,10 @@ namespace MediaBrowser.Controller
|
|||||||
string GetSmartApiUrl(string hostname, int? port = null);
|
string GetSmartApiUrl(string hostname, int? port = null);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a localhost URL that can be used to access the API using the loop-back IP address.
|
/// Gets an URL that can be used to access the API over HTTP (not HTTPS).
|
||||||
/// over HTTP (not HTTPS).
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The API URL.</returns>
|
/// <returns>The API URL.</returns>
|
||||||
string GetLoopbackHttpApiUrl();
|
string GetInterfaceHttpApiUrl();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a local (LAN) URL that can be used to access the API.
|
/// Gets a local (LAN) URL that can be used to access the API.
|
||||||
|
@ -35,9 +35,9 @@ namespace Jellyfin.Networking.Tests
|
|||||||
// eth16 only
|
// eth16 only
|
||||||
[InlineData("192.168.1.208/24,-16,eth16|200.200.200.200/24,11,eth11", "192.168.1.0/24", "[192.168.1.208/24]")]
|
[InlineData("192.168.1.208/24,-16,eth16|200.200.200.200/24,11,eth11", "192.168.1.0/24", "[192.168.1.208/24]")]
|
||||||
// All interfaces excluded. (including loopbacks)
|
// All interfaces excluded. (including loopbacks)
|
||||||
[InlineData("192.168.1.208/24,-16,vEthernet1|192.168.2.208/24,-16,vEthernet212|200.200.200.200/24,11,eth11", "192.168.1.0/24", "[127.0.0.1/8,::1/128]")]
|
[InlineData("192.168.1.208/24,-16,vEthernet1|192.168.2.208/24,-16,vEthernet212|200.200.200.200/24,11,eth11", "192.168.1.0/24", "[]")]
|
||||||
// vEthernet1 and vEthernet212 should be excluded.
|
// vEthernet1 and vEthernet212 should be excluded.
|
||||||
[InlineData("192.168.1.200/24,-20,vEthernet1|192.168.2.208/24,-16,vEthernet212|200.200.200.200/24,11,eth11", "192.168.1.0/24;200.200.200.200/24", "[200.200.200.200/24,127.0.0.1/8,::1/128]")]
|
[InlineData("192.168.1.200/24,-20,vEthernet1|192.168.2.208/24,-16,vEthernet212|200.200.200.200/24,11,eth11", "192.168.1.0/24;200.200.200.200/24", "[200.200.200.200/24]")]
|
||||||
// Overlapping interface,
|
// Overlapping interface,
|
||||||
[InlineData("192.168.1.110/24,-20,br0|192.168.1.10/24,-16,br0|200.200.200.200/24,11,eth11", "192.168.1.0/24", "[192.168.1.110/24,192.168.1.10/24]")]
|
[InlineData("192.168.1.110/24,-20,br0|192.168.1.10/24,-16,br0|200.200.200.200/24,11,eth11", "192.168.1.0/24", "[192.168.1.110/24,192.168.1.10/24]")]
|
||||||
public void IgnoreVirtualInterfaces(string interfaces, string lan, string value)
|
public void IgnoreVirtualInterfaces(string interfaces, string lan, string value)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user