diff --git a/MediaBrowser.Controller/IServerApplicationHost.cs b/MediaBrowser.Controller/IServerApplicationHost.cs
index fb843d1915..e4eecec18f 100644
--- a/MediaBrowser.Controller/IServerApplicationHost.cs
+++ b/MediaBrowser.Controller/IServerApplicationHost.cs
@@ -79,5 +79,12 @@ namespace MediaBrowser.Controller
/// The host.
/// System.String.
string GetLocalApiUrl(string host);
+
+ ///
+ /// Gets the local API URL.
+ ///
+ /// The ip address.
+ /// System.String.
+ string GetLocalApiUrl(IPAddress ipAddress);
}
}
diff --git a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
index 2133888b61..8a30fbf406 100644
--- a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
+++ b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
@@ -161,7 +161,7 @@ namespace MediaBrowser.Dlna.Main
var descriptorURI = "/dlna/" + udn + "/description.xml";
- var uri = new Uri(_appHost.GetLocalApiUrl(addressString) + descriptorURI);
+ var uri = new Uri(_appHost.GetLocalApiUrl(address) + descriptorURI);
var services = new List
{
diff --git a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs
index 0328111c58..d2b48474c6 100644
--- a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs
+++ b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs
@@ -171,7 +171,7 @@ namespace MediaBrowser.Dlna.PlayTo
private string GetServerAddress(IPAddress localIp)
{
- return _appHost.GetLocalApiUrl(localIp.ToString());
+ return _appHost.GetLocalApiUrl(localIp);
}
public void Dispose()
diff --git a/MediaBrowser.Model/LiveTv/LiveTvOptions.cs b/MediaBrowser.Model/LiveTv/LiveTvOptions.cs
index e705102db8..c6b8385b0f 100644
--- a/MediaBrowser.Model/LiveTv/LiveTvOptions.cs
+++ b/MediaBrowser.Model/LiveTv/LiveTvOptions.cs
@@ -29,6 +29,7 @@ namespace MediaBrowser.Model.LiveTv
public string Id { get; set; }
public string Url { get; set; }
public string Type { get; set; }
+ public string DeviceId { get; set; }
public bool ImportFavoritesOnly { get; set; }
public bool IsEnabled { get; set; }
diff --git a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs b/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs
index d7477225c8..618b7ffc5e 100644
--- a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs
+++ b/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs
@@ -81,6 +81,12 @@ namespace MediaBrowser.Server.Implementations.Connect
if (!ip.StartsWith("http://", StringComparison.OrdinalIgnoreCase) &&
!ip.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
+ // Handle ipv6
+ if (ip.IndexOf(':') != -1)
+ {
+ ip = "[" + ip + "]";
+ }
+
ip = (_appHost.EnableHttps ? "https://" : "http://") + ip;
}
@@ -316,7 +322,7 @@ namespace MediaBrowser.Server.Implementations.Connect
try
{
- _fileSystem.CreateDirectory(Path.GetDirectoryName(path));
+ _fileSystem.CreateDirectory(Path.GetDirectoryName(path));
var json = _json.SerializeToString(_data);
@@ -324,7 +330,7 @@ namespace MediaBrowser.Server.Implementations.Connect
lock (_dataFileLock)
{
- _fileSystem.WriteAllText(path, encrypted, Encoding.UTF8);
+ _fileSystem.WriteAllText(path, encrypted, Encoding.UTF8);
}
}
catch (Exception ex)
@@ -341,7 +347,7 @@ namespace MediaBrowser.Server.Implementations.Connect
{
lock (_dataFileLock)
{
- var encrypted = _fileSystem.ReadAllText(path, Encoding.UTF8);
+ var encrypted = _fileSystem.ReadAllText(path, Encoding.UTF8);
var json = _encryption.DecryptString(encrypted);
@@ -381,7 +387,7 @@ namespace MediaBrowser.Server.Implementations.Connect
{
await UpdateConnectInfo().ConfigureAwait(false);
}
-
+
await _operationLock.WaitAsync().ConfigureAwait(false);
try
@@ -480,7 +486,7 @@ namespace MediaBrowser.Server.Implementations.Connect
{
await UpdateConnectInfo().ConfigureAwait(false);
}
-
+
await _operationLock.WaitAsync().ConfigureAwait(false);
try
diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunDiscovery.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunDiscovery.cs
index 0a03e60fae..aa4030b813 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunDiscovery.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunDiscovery.cs
@@ -10,6 +10,7 @@ using System;
using System.Linq;
using System.Threading;
using MediaBrowser.Common.Net;
+using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
{
@@ -21,6 +22,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
private readonly ILiveTvManager _liveTvManager;
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
private readonly IHttpClient _httpClient;
+ private IJsonSerializer _json;
public HdHomerunDiscovery(IDeviceDiscovery deviceDiscovery, IServerConfigurationManager config, ILogger logger, ILiveTvManager liveTvManager, IHttpClient httpClient)
{
@@ -79,21 +81,37 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
url = new Uri(url).GetComponents(UriComponents.AbsoluteUri & ~UriComponents.Port, UriFormat.UriEscaped).TrimEnd('/');
// Test it by pulling down the lineup
- using (await _httpClient.Get(new HttpRequestOptions
+ using (var stream = await _httpClient.Get(new HttpRequestOptions
{
- Url = string.Format("{0}/lineup.json", url),
+ Url = string.Format("{0}/discover.json", url),
CancellationToken = CancellationToken.None
}))
{
- }
-
- await _liveTvManager.SaveTunerHost(new TunerHostInfo
- {
- Type = HdHomerunHost.DeviceType,
- Url = url,
- DataVersion = 1
+ var response = _json.DeserializeFromStream(stream);
- }).ConfigureAwait(false);
+ var existing = GetConfiguration().TunerHosts
+ .FirstOrDefault(i => string.Equals(i.Type, HdHomerunHost.DeviceType, StringComparison.OrdinalIgnoreCase) && string.Equals(i.DeviceId, response.DeviceID, StringComparison.OrdinalIgnoreCase));
+
+ if (existing == null)
+ {
+ await _liveTvManager.SaveTunerHost(new TunerHostInfo
+ {
+ Type = HdHomerunHost.DeviceType,
+ Url = url,
+ DataVersion = 1,
+ DeviceId = response.DeviceID
+
+ }).ConfigureAwait(false);
+ }
+ else
+ {
+ if (!string.Equals(existing.Url, url, StringComparison.OrdinalIgnoreCase))
+ {
+ existing.Url = url;
+ await _liveTvManager.SaveTunerHost(existing).ConfigureAwait(false);
+ }
+ }
+ }
}
catch (Exception ex)
{
diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
index bdfbee5217..1995fc311d 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
@@ -415,9 +415,21 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
public async Task Validate(TunerHostInfo info)
{
- if (info.IsEnabled)
+ if (!info.IsEnabled)
{
- await GetChannels(info, false, CancellationToken.None).ConfigureAwait(false);
+ return;
+ }
+
+ // Test it by pulling down the lineup
+ using (var stream = await _httpClient.Get(new HttpRequestOptions
+ {
+ Url = string.Format("{0}/discover.json", GetApiUrl(info, false)),
+ CancellationToken = CancellationToken.None
+ }))
+ {
+ var response = JsonSerializer.DeserializeFromStream(stream);
+
+ info.DeviceId = response.DeviceID;
}
}
diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
index b71fe365d3..269c306694 100644
--- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
+++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
@@ -97,6 +97,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
+using System.Net.Sockets;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
@@ -322,7 +323,7 @@ namespace MediaBrowser.Server.Startup.Common
{
TaskManager.SuspendTriggers = true;
}
-
+
await base.RunStartupTasks().ConfigureAwait(false);
Logger.Info("ServerId: {0}", SystemId);
@@ -1134,7 +1135,7 @@ namespace MediaBrowser.Server.Startup.Common
if (address != null)
{
- return GetLocalApiUrl(address.ToString());
+ return GetLocalApiUrl(address);
}
return null;
@@ -1148,6 +1149,16 @@ namespace MediaBrowser.Server.Startup.Common
}
}
+ public string GetLocalApiUrl(IPAddress ipAddress)
+ {
+ if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
+ {
+ return GetLocalApiUrl("[" + ipAddress + "]");
+ }
+
+ return GetLocalApiUrl(ipAddress.ToString());
+ }
+
public string GetLocalApiUrl(string host)
{
return string.Format("http://{0}:{1}",
@@ -1180,7 +1191,7 @@ namespace MediaBrowser.Server.Startup.Common
return true;
}
- var apiUrl = GetLocalApiUrl(address.ToString());
+ var apiUrl = GetLocalApiUrl(address);
apiUrl += "/system/ping";
if ((DateTime.UtcNow - _lastAddressCacheClear).TotalMinutes >= 5)