diff --git a/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs
index 1b9146644a..0bcc5c711e 100644
--- a/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs
+++ b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs
@@ -9,6 +9,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
+using CommonIO;
namespace MediaBrowser.Common.Implementations.Configuration
{
@@ -54,6 +55,7 @@ namespace MediaBrowser.Common.Implementations.Configuration
///
/// The application paths.
public IApplicationPaths CommonApplicationPaths { get; private set; }
+ public readonly IFileSystem FileSystem;
///
/// The _configuration loaded
@@ -96,10 +98,11 @@ namespace MediaBrowser.Common.Implementations.Configuration
/// The application paths.
/// The log manager.
/// The XML serializer.
- protected BaseConfigurationManager(IApplicationPaths applicationPaths, ILogManager logManager, IXmlSerializer xmlSerializer)
+ protected BaseConfigurationManager(IApplicationPaths applicationPaths, ILogManager logManager, IXmlSerializer xmlSerializer, IFileSystem fileSystem)
{
CommonApplicationPaths = applicationPaths;
XmlSerializer = xmlSerializer;
+ FileSystem = fileSystem;
Logger = logManager.GetLogger(GetType().Name);
UpdateCachePath();
@@ -199,9 +202,19 @@ namespace MediaBrowser.Common.Implementations.Configuration
{
throw new DirectoryNotFoundException(string.Format("{0} does not exist.", newPath));
}
+
+ EnsureWriteAccess(newPath);
}
}
+ protected void EnsureWriteAccess(string path)
+ {
+ var file = Path.Combine(path, Guid.NewGuid().ToString());
+
+ FileSystem.WriteAllText(file, string.Empty);
+ FileSystem.DeleteFile(file);
+ }
+
private readonly ConcurrentDictionary _configurations = new ConcurrentDictionary();
private string GetConfigurationFile(string key)
diff --git a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
index 86aae959d7..2578602a14 100644
--- a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
+++ b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
@@ -465,7 +465,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
}
catch (OperationCanceledException ex)
{
- var exception = GetCancellationException(options.Url, options.CancellationToken, ex);
+ var exception = GetCancellationException(options, options.CancellationToken, ex);
var httpException = exception as HttpException;
@@ -497,7 +497,10 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
/// HttpException.
private HttpException GetException(WebException ex, HttpRequestOptions options)
{
- _logger.ErrorException("Error getting response from " + options.Url, ex);
+ if (options.LogErrors)
+ {
+ _logger.ErrorException("Error getting response from " + options.Url, ex);
+ }
var exception = new HttpException(ex.Message, ex);
@@ -710,10 +713,13 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
if (operationCanceledException != null)
{
- return GetCancellationException(options.Url, options.CancellationToken, operationCanceledException);
+ return GetCancellationException(options, options.CancellationToken, operationCanceledException);
}
- _logger.ErrorException("Error getting response from " + options.Url, ex);
+ if (options.LogErrors)
+ {
+ _logger.ErrorException("Error getting response from " + options.Url, ex);
+ }
return ex;
}
@@ -785,18 +791,21 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
///
/// Throws the cancellation exception.
///
- /// The URL.
+ /// The options.
/// The cancellation token.
/// The exception.
/// Exception.
- private Exception GetCancellationException(string url, CancellationToken cancellationToken, OperationCanceledException exception)
+ private Exception GetCancellationException(HttpRequestOptions options, CancellationToken cancellationToken, OperationCanceledException exception)
{
// If the HttpClient's timeout is reached, it will cancel the Task internally
if (!cancellationToken.IsCancellationRequested)
{
- var msg = string.Format("Connection to {0} timed out", url);
+ var msg = string.Format("Connection to {0} timed out", options.Url);
- _logger.Error(msg);
+ if (options.LogErrors)
+ {
+ _logger.Error(msg);
+ }
// Throw an HttpException so that the caller doesn't think it was cancelled by user code
return new HttpException(msg, exception)
diff --git a/MediaBrowser.Common/Net/HttpRequestOptions.cs b/MediaBrowser.Common/Net/HttpRequestOptions.cs
index 81f1d70d39..8c1f63e534 100644
--- a/MediaBrowser.Common/Net/HttpRequestOptions.cs
+++ b/MediaBrowser.Common/Net/HttpRequestOptions.cs
@@ -87,6 +87,7 @@ namespace MediaBrowser.Common.Net
public bool BufferContent { get; set; }
public bool LogRequest { get; set; }
+ public bool LogErrors { get; set; }
public bool LogErrorResponseBody { get; set; }
public bool EnableKeepAlive { get; set; }
@@ -116,6 +117,7 @@ namespace MediaBrowser.Common.Net
RequestHeaders = new Dictionary(StringComparer.OrdinalIgnoreCase);
LogRequest = true;
+ LogErrors = true;
CacheMode = CacheMode.None;
TimeoutMs = 20000;
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
index ac27a0ab4e..8a19ee4316 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
@@ -172,30 +172,31 @@ namespace MediaBrowser.Server.Implementations.Collections
itemList.Add(item);
- if (currentLinkedChildren.Any(i => i.Id == itemId))
+ if (currentLinkedChildren.All(i => i.Id != itemId))
{
- throw new ArgumentException("Item already exists in collection");
+ list.Add(LinkedChild.Create(item));
}
-
- list.Add(LinkedChild.Create(item));
}
- collection.LinkedChildren.AddRange(list);
-
- collection.UpdateRatingToContent();
-
- await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
-
- _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(_fileSystem));
-
- if (fireEvent)
+ if (list.Count > 0)
{
- EventHelper.FireEventIfNotNull(ItemsAddedToCollection, this, new CollectionModifiedEventArgs
- {
- Collection = collection,
- ItemsChanged = itemList
+ collection.LinkedChildren.AddRange(list);
- }, _logger);
+ collection.UpdateRatingToContent();
+
+ await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+
+ _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(_fileSystem));
+
+ if (fireEvent)
+ {
+ EventHelper.FireEventIfNotNull(ItemsAddedToCollection, this, new CollectionModifiedEventArgs
+ {
+ Collection = collection,
+ ItemsChanged = itemList
+
+ }, _logger);
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
index 45b1595742..a7d3854e71 100644
--- a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
+++ b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
@@ -16,7 +16,6 @@ using System;
using System.IO;
using System.Linq;
using CommonIO;
-using MediaBrowser.Common.IO;
namespace MediaBrowser.Server.Implementations.Configuration
{
@@ -25,7 +24,6 @@ namespace MediaBrowser.Server.Implementations.Configuration
///
public class ServerConfigurationManager : BaseConfigurationManager, IServerConfigurationManager
{
- private readonly IFileSystem _fileSystem;
///
/// Initializes a new instance of the class.
@@ -33,10 +31,10 @@ namespace MediaBrowser.Server.Implementations.Configuration
/// The application paths.
/// The log manager.
/// The XML serializer.
+ /// The file system.
public ServerConfigurationManager(IApplicationPaths applicationPaths, ILogManager logManager, IXmlSerializer xmlSerializer, IFileSystem fileSystem)
- : base(applicationPaths, logManager, xmlSerializer)
+ : base(applicationPaths, logManager, xmlSerializer, fileSystem)
{
- _fileSystem = fileSystem;
UpdateItemsByNamePath();
UpdateMetadataPath();
}
@@ -203,7 +201,7 @@ namespace MediaBrowser.Server.Implementations.Configuration
&& !string.Equals(Configuration.ItemsByNamePath ?? string.Empty, newPath))
{
// Validate
- if (!_fileSystem.DirectoryExists(newPath))
+ if (!FileSystem.DirectoryExists(newPath))
{
throw new DirectoryNotFoundException(string.Format("{0} does not exist.", newPath));
}
@@ -225,7 +223,7 @@ namespace MediaBrowser.Server.Implementations.Configuration
&& !string.Equals(Configuration.MetadataPath ?? string.Empty, newPath))
{
// Validate
- if (!_fileSystem.DirectoryExists(newPath))
+ if (!FileSystem.DirectoryExists(newPath))
{
throw new DirectoryNotFoundException(string.Format("{0} does not exist.", newPath));
}
@@ -234,14 +232,6 @@ namespace MediaBrowser.Server.Implementations.Configuration
}
}
- private void EnsureWriteAccess(string path)
- {
- var file = Path.Combine(path, Guid.NewGuid().ToString());
-
- _fileSystem.WriteAllText(file, string.Empty);
- _fileSystem.DeleteFile(file);
- }
-
public void DisableMetadataService(string service)
{
DisableMetadataService(typeof(Movie), Configuration, service);
diff --git a/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs b/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs
index c7e4379318..9622afb970 100644
--- a/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs
+++ b/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs
@@ -49,14 +49,23 @@ namespace MediaBrowser.Server.Implementations.Connect
private async void TimerCallback(object state)
{
+ var index = 0;
+
foreach (var ipLookupUrl in _ipLookups)
{
try
{
+ // Sometimes whatismyipaddress might fail, but it won't do us any good having users raise alarms over it.
+ var logErrors = index > 0;
+
+#if DEBUG
+ logErrors = true;
+#endif
using (var stream = await _httpClient.Get(new HttpRequestOptions
{
Url = ipLookupUrl,
- UserAgent = "Emby Server/" + _appHost.ApplicationVersion
+ UserAgent = "Emby Server/" + _appHost.ApplicationVersion,
+ LogErrors = logErrors
}).ConfigureAwait(false))
{
@@ -80,6 +89,8 @@ namespace MediaBrowser.Server.Implementations.Connect
{
_logger.ErrorException("Error getting connection info", ex);
}
+
+ index++;
}
}
@@ -94,8 +105,8 @@ namespace MediaBrowser.Server.Implementations.Connect
try
{
- _fileSystem.CreateDirectory(Path.GetDirectoryName(path));
- _fileSystem.WriteAllText(path, address, Encoding.UTF8);
+ _fileSystem.CreateDirectory(Path.GetDirectoryName(path));
+ _fileSystem.WriteAllText(path, address, Encoding.UTF8);
}
catch (Exception ex)
{
@@ -109,7 +120,7 @@ namespace MediaBrowser.Server.Implementations.Connect
try
{
- var endpoint = _fileSystem.ReadAllText(path, Encoding.UTF8);
+ var endpoint = _fileSystem.ReadAllText(path, Encoding.UTF8);
if (IsValid(endpoint))
{