mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-04 06:48:35 +01:00
rework upnp discovery
This commit is contained in:
@@ -9,6 +9,7 @@ using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Net;
|
||||
using MediaBrowser.Common.Threading;
|
||||
using MediaBrowser.Model.Events;
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||
{
|
||||
@@ -17,17 +18,17 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||
private readonly IServerApplicationHost _appHost;
|
||||
private readonly ILogger _logger;
|
||||
private readonly IServerConfigurationManager _config;
|
||||
private readonly ISsdpHandler _ssdp;
|
||||
private readonly IDeviceDiscovery _deviceDiscovery;
|
||||
|
||||
private PeriodicTimer _timer;
|
||||
private bool _isStarted;
|
||||
|
||||
public ExternalPortForwarding(ILogManager logmanager, IServerApplicationHost appHost, IServerConfigurationManager config, ISsdpHandler ssdp)
|
||||
public ExternalPortForwarding(ILogManager logmanager, IServerApplicationHost appHost, IServerConfigurationManager config, IDeviceDiscovery deviceDiscovery)
|
||||
{
|
||||
_logger = logmanager.GetLogger("PortMapper");
|
||||
_appHost = appHost;
|
||||
_config = config;
|
||||
_ssdp = ssdp;
|
||||
_deviceDiscovery = deviceDiscovery;
|
||||
}
|
||||
|
||||
private string _lastConfigIdentifier;
|
||||
@@ -61,7 +62,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||
|
||||
public void Run()
|
||||
{
|
||||
//NatUtility.Logger = new LogWriter(_logger);
|
||||
NatUtility.Logger = _logger;
|
||||
|
||||
if (_config.Configuration.EnableUPnP)
|
||||
{
|
||||
@@ -93,33 +94,22 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||
|
||||
_timer = new PeriodicTimer(ClearCreatedRules, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
|
||||
|
||||
_ssdp.MessageReceived += _ssdp_MessageReceived;
|
||||
_deviceDiscovery.DeviceDiscovered += _deviceDiscovery_DeviceDiscovered;
|
||||
|
||||
_lastConfigIdentifier = GetConfigIdentifier();
|
||||
|
||||
_isStarted = true;
|
||||
}
|
||||
|
||||
private void ClearCreatedRules(object state)
|
||||
private async void _deviceDiscovery_DeviceDiscovered(object sender, GenericEventArgs<UpnpDeviceInfo> e)
|
||||
{
|
||||
_createdRules = new List<string>();
|
||||
_usnsHandled = new List<string>();
|
||||
}
|
||||
|
||||
void _ssdp_MessageReceived(object sender, SsdpMessageEventArgs e)
|
||||
{
|
||||
var endpoint = e.EndPoint as IPEndPoint;
|
||||
|
||||
if (endpoint == null || e.LocalEndPoint == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var info = e.Argument;
|
||||
|
||||
string usn;
|
||||
if (!e.Headers.TryGetValue("USN", out usn)) usn = string.Empty;
|
||||
if (!info.Headers.TryGetValue("USN", out usn)) usn = string.Empty;
|
||||
|
||||
string nt;
|
||||
if (!e.Headers.TryGetValue("NT", out nt)) nt = string.Empty;
|
||||
if (!info.Headers.TryGetValue("NT", out nt)) nt = string.Empty;
|
||||
|
||||
// Filter device type
|
||||
if (usn.IndexOf("WANIPConnection:", StringComparison.OrdinalIgnoreCase) == -1 &&
|
||||
@@ -132,15 +122,45 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||
|
||||
var identifier = string.IsNullOrWhiteSpace(usn) ? nt : usn;
|
||||
|
||||
if (!_usnsHandled.Contains(identifier))
|
||||
if (info.Location != null && !_usnsHandled.Contains(identifier))
|
||||
{
|
||||
_usnsHandled.Add(identifier);
|
||||
|
||||
_logger.Debug("Calling Nat.Handle on " + identifier);
|
||||
NatUtility.Handle(e.LocalEndPoint.Address, e.Message, endpoint, NatProtocol.Upnp);
|
||||
|
||||
IPAddress address;
|
||||
if (IPAddress.TryParse(info.Location.Host, out address))
|
||||
{
|
||||
// The Handle method doesn't need the port
|
||||
var endpoint = new IPEndPoint(address, info.Location.Port);
|
||||
|
||||
IPAddress localAddress = null;
|
||||
|
||||
try
|
||||
{
|
||||
var localAddressString = await _appHost.GetLocalApiUrl().ConfigureAwait(false);
|
||||
|
||||
if (!IPAddress.TryParse(localAddressString, out localAddress))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
NatUtility.Handle(localAddress, info, endpoint, NatProtocol.Upnp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ClearCreatedRules(object state)
|
||||
{
|
||||
_createdRules = new List<string>();
|
||||
_usnsHandled = new List<string>();
|
||||
}
|
||||
|
||||
void NatUtility_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
||||
{
|
||||
var ex = e.ExceptionObject as Exception;
|
||||
@@ -228,7 +248,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||
_timer = null;
|
||||
}
|
||||
|
||||
_ssdp.MessageReceived -= _ssdp_MessageReceived;
|
||||
_deviceDiscovery.DeviceDiscovered -= _deviceDiscovery_DeviceDiscovered;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -164,32 +164,16 @@ namespace MediaBrowser.Server.Implementations.IO
|
||||
Start();
|
||||
}
|
||||
|
||||
private bool EnableLibraryMonitor
|
||||
{
|
||||
get
|
||||
{
|
||||
switch (ConfigurationManager.Configuration.EnableLibraryMonitor)
|
||||
{
|
||||
case AutoOnOff.Auto:
|
||||
return Environment.OSVersion.Platform == PlatformID.Win32NT;
|
||||
case AutoOnOff.Enabled:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsLibraryMonitorEnabaled(BaseItem item)
|
||||
{
|
||||
var options = LibraryManager.GetLibraryOptions(item);
|
||||
|
||||
if (options != null && options.SchemaVersion >= 1)
|
||||
if (options != null)
|
||||
{
|
||||
return options.EnableRealtimeMonitor;
|
||||
}
|
||||
|
||||
return EnableLibraryMonitor;
|
||||
return false;
|
||||
}
|
||||
|
||||
public void Start()
|
||||
|
||||
@@ -166,7 +166,27 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
||||
var imageIndex = images.FindIndex(i => i.programID == schedule.programID.Substring(0, 10));
|
||||
if (imageIndex > -1)
|
||||
{
|
||||
programDict[schedule.programID].images = GetProgramLogo(ApiUrl, images[imageIndex]);
|
||||
var programEntry = programDict[schedule.programID];
|
||||
|
||||
var data = images[imageIndex].data ?? new List<ScheduleDirect.ImageData>();
|
||||
data = data.OrderByDescending(GetSizeOrder).ToList();
|
||||
|
||||
programEntry.primaryImage = GetProgramImage(ApiUrl, data, "Logo", true);
|
||||
//programEntry.thumbImage = GetProgramImage(ApiUrl, data, "Iconic", false);
|
||||
//programEntry.bannerImage = GetProgramImage(ApiUrl, data, "Banner", false) ??
|
||||
// GetProgramImage(ApiUrl, data, "Banner-L1", false) ??
|
||||
// GetProgramImage(ApiUrl, data, "Banner-LO", false) ??
|
||||
// GetProgramImage(ApiUrl, data, "Banner-LOT", false);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(programEntry.thumbImage))
|
||||
{
|
||||
var b = true;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(programEntry.bannerImage))
|
||||
{
|
||||
var b = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,6 +199,20 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
||||
return programsInfo;
|
||||
}
|
||||
|
||||
private int GetSizeOrder(ScheduleDirect.ImageData image)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(image.size))
|
||||
{
|
||||
int value;
|
||||
if (int.TryParse(image.size, out value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private readonly object _channelCacheLock = new object();
|
||||
private ScheduleDirect.Station GetStation(string listingsId, string channelNumber, string channelName)
|
||||
{
|
||||
@@ -384,13 +418,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
||||
episodeTitle = details.episodeTitle150;
|
||||
}
|
||||
|
||||
string imageUrl = null;
|
||||
|
||||
if (details.hasImageArtwork)
|
||||
{
|
||||
imageUrl = details.images;
|
||||
}
|
||||
|
||||
var showType = details.showType ?? string.Empty;
|
||||
|
||||
var info = new ProgramInfo
|
||||
@@ -406,7 +433,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
||||
Audio = audioType,
|
||||
IsRepeat = repeat,
|
||||
IsSeries = showType.IndexOf("series", StringComparison.OrdinalIgnoreCase) != -1,
|
||||
ImageUrl = imageUrl,
|
||||
ImageUrl = details.primaryImage,
|
||||
IsKids = string.Equals(details.audience, "children", StringComparison.OrdinalIgnoreCase),
|
||||
IsSports = showType.IndexOf("sports", StringComparison.OrdinalIgnoreCase) != -1,
|
||||
IsMovie = showType.IndexOf("movie", StringComparison.OrdinalIgnoreCase) != -1 || showType.IndexOf("film", StringComparison.OrdinalIgnoreCase) != -1,
|
||||
@@ -485,36 +512,33 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
||||
return date;
|
||||
}
|
||||
|
||||
private string GetProgramLogo(string apiUrl, ScheduleDirect.ShowImages images)
|
||||
private string GetProgramImage(string apiUrl, List<ScheduleDirect.ImageData> images, string category, bool returnDefaultImage)
|
||||
{
|
||||
string url = null;
|
||||
if (images.data != null)
|
||||
{
|
||||
var smallImages = images.data.Where(i => i.size == "Sm").ToList();
|
||||
if (smallImages.Any())
|
||||
{
|
||||
images.data = smallImages;
|
||||
}
|
||||
var logoIndex = images.data.FindIndex(i => i.category == "Logo");
|
||||
if (logoIndex == -1)
|
||||
{
|
||||
logoIndex = 0;
|
||||
}
|
||||
var uri = images.data[logoIndex].uri;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(uri))
|
||||
var logoIndex = images.FindIndex(i => string.Equals(i.category, category, StringComparison.OrdinalIgnoreCase));
|
||||
if (logoIndex == -1)
|
||||
{
|
||||
if (!returnDefaultImage)
|
||||
{
|
||||
if (uri.IndexOf("http", StringComparison.OrdinalIgnoreCase) != -1)
|
||||
{
|
||||
url = uri;
|
||||
}
|
||||
else
|
||||
{
|
||||
url = apiUrl + "/image/" + uri;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
//_logger.Debug("URL for image is : " + url);
|
||||
logoIndex = 0;
|
||||
}
|
||||
var uri = images[logoIndex].uri;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(uri))
|
||||
{
|
||||
if (uri.IndexOf("http", StringComparison.OrdinalIgnoreCase) != -1)
|
||||
{
|
||||
url = uri;
|
||||
}
|
||||
else
|
||||
{
|
||||
url = apiUrl + "/image/" + uri;
|
||||
}
|
||||
}
|
||||
//_logger.Debug("URL for image is : " + url);
|
||||
return url;
|
||||
}
|
||||
|
||||
@@ -1204,7 +1228,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
||||
public List<Crew> crew { get; set; }
|
||||
public string showType { get; set; }
|
||||
public bool hasImageArtwork { get; set; }
|
||||
public string images { get; set; }
|
||||
public string primaryImage { get; set; }
|
||||
public string thumbImage { get; set; }
|
||||
public string bannerImage { get; set; }
|
||||
public string imageID { get; set; }
|
||||
public string md5 { get; set; }
|
||||
public List<string> contentAdvisory { get; set; }
|
||||
|
||||
@@ -10,6 +10,7 @@ using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Model.Events;
|
||||
using MediaBrowser.Model.Serialization;
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||
@@ -39,13 +40,15 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||
_deviceDiscovery.DeviceDiscovered += _deviceDiscovery_DeviceDiscovered;
|
||||
}
|
||||
|
||||
void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e)
|
||||
void _deviceDiscovery_DeviceDiscovered(object sender, GenericEventArgs<UpnpDeviceInfo> e)
|
||||
{
|
||||
string server = null;
|
||||
if (e.Headers.TryGetValue("SERVER", out server) && server.IndexOf("HDHomeRun", StringComparison.OrdinalIgnoreCase) != -1)
|
||||
var info = e.Argument;
|
||||
|
||||
if (info.Headers.TryGetValue("SERVER", out server) && server.IndexOf("HDHomeRun", StringComparison.OrdinalIgnoreCase) != -1)
|
||||
{
|
||||
string location;
|
||||
if (e.Headers.TryGetValue("Location", out location))
|
||||
if (info.Headers.TryGetValue("Location", out location))
|
||||
{
|
||||
//_logger.Debug("HdHomerun found at {0}", location);
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ using MediaBrowser.Model.Logging;
|
||||
using MediaBrowser.Model.Serialization;
|
||||
using MediaBrowser.Model.Extensions;
|
||||
using System.Xml.Linq;
|
||||
using MediaBrowser.Model.Events;
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp
|
||||
{
|
||||
@@ -50,18 +51,20 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp
|
||||
_deviceDiscovery.DeviceDiscovered += _deviceDiscovery_DeviceDiscovered;
|
||||
}
|
||||
|
||||
void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e)
|
||||
void _deviceDiscovery_DeviceDiscovered(object sender, GenericEventArgs<UpnpDeviceInfo> e)
|
||||
{
|
||||
var info = e.Argument;
|
||||
|
||||
string st = null;
|
||||
string nt = null;
|
||||
e.Headers.TryGetValue("ST", out st);
|
||||
e.Headers.TryGetValue("NT", out nt);
|
||||
info.Headers.TryGetValue("ST", out st);
|
||||
info.Headers.TryGetValue("NT", out nt);
|
||||
|
||||
if (string.Equals(st, "urn:ses-com:device:SatIPServer:1", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(nt, "urn:ses-com:device:SatIPServer:1", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
string location;
|
||||
if (e.Headers.TryGetValue("Location", out location) && !string.IsNullOrWhiteSpace(location))
|
||||
if (info.Headers.TryGetValue("Location", out location) && !string.IsNullOrWhiteSpace(location))
|
||||
{
|
||||
_logger.Debug("SAT IP found at {0}", location);
|
||||
|
||||
|
||||
@@ -105,9 +105,6 @@
|
||||
<Reference Include="UniversalDetector">
|
||||
<HintPath>..\ThirdParty\UniversalDetector\UniversalDetector.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Mono.Nat">
|
||||
<HintPath>..\packages\Mono.Nat.1.2.24.0\lib\net40\Mono.Nat.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\SharedVersion.cs">
|
||||
@@ -390,6 +387,10 @@
|
||||
<Project>{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}</Project>
|
||||
<Name>MediaBrowser.Model</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Mono.Nat\Mono.Nat.csproj">
|
||||
<Project>{d7453b88-2266-4805-b39b-2b5a2a33e1ba}</Project>
|
||||
<Name>Mono.Nat</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Localization\Ratings\us.txt" />
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
<package id="ini-parser" version="2.3.0" targetFramework="net45" />
|
||||
<package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" />
|
||||
<package id="MediaBrowser.Naming" version="1.0.0.55" targetFramework="net45" />
|
||||
<package id="Mono.Nat" version="1.2.24.0" targetFramework="net45" />
|
||||
<package id="morelinq" version="1.4.0" targetFramework="net45" />
|
||||
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
|
||||
<package id="SimpleInjector" version="3.2.0" targetFramework="net45" />
|
||||
|
||||
Reference in New Issue
Block a user