diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs
index 9767de9e0a..2933a9f22e 100644
--- a/Emby.Server.Implementations/Dto/DtoService.cs
+++ b/Emby.Server.Implementations/Dto/DtoService.cs
@@ -1539,7 +1539,7 @@ namespace Emby.Server.Implementations.Dto
dto.ParentArtImageTag = GetImageCacheTag(parent, image);
}
}
- if (thumbLimit > 0 && !dto.HasThumb && (dto.ParentThumbItemId == null || parent is Series))
+ if (thumbLimit > 0 && !dto.HasThumb && (dto.ParentThumbItemId == null || parent is Series) && !(parent is ICollectionFolder) && !(parent is UserView))
{
var image = allImages.FirstOrDefault(i => i.Type == ImageType.Thumb);
diff --git a/Emby.Server.Implementations/ScheduledTasks/SystemUpdateTask.cs b/Emby.Server.Implementations/ScheduledTasks/SystemUpdateTask.cs
index a41e21a4b7..52bd0a5049 100644
--- a/Emby.Server.Implementations/ScheduledTasks/SystemUpdateTask.cs
+++ b/Emby.Server.Implementations/ScheduledTasks/SystemUpdateTask.cs
@@ -68,23 +68,14 @@ namespace Emby.Server.Implementations.ScheduledTasks
/// Task.
public async Task Execute(CancellationToken cancellationToken, IProgress progress)
{
- EventHandler innerProgressHandler = (sender, e) => progress.Report(e * .1);
-
// Create a progress object for the update check
- var innerProgress = new SimpleProgress();
- innerProgress.ProgressChanged += innerProgressHandler;
-
- var updateInfo = await _appHost.CheckForApplicationUpdate(cancellationToken, innerProgress).ConfigureAwait(false);
-
- // Release the event handler
- innerProgress.ProgressChanged -= innerProgressHandler;
+ var updateInfo = await _appHost.CheckForApplicationUpdate(cancellationToken, new SimpleProgress()).ConfigureAwait(false);
progress.Report(10);
if (!updateInfo.IsUpdateAvailable)
{
Logger.Debug("No application update available.");
- progress.Report(100);
return;
}
@@ -96,9 +87,9 @@ namespace Emby.Server.Implementations.ScheduledTasks
{
Logger.Info("Update Revision {0} available. Updating...", updateInfo.AvailableVersion);
- innerProgressHandler = (sender, e) => progress.Report(e * .9 + .1);
+ EventHandler innerProgressHandler = (sender, e) => progress.Report(e * .9 + .1);
- innerProgress = new SimpleProgress();
+ var innerProgress = new SimpleProgress();
innerProgress.ProgressChanged += innerProgressHandler;
await _appHost.UpdateApplication(updateInfo.Package, cancellationToken, innerProgress).ConfigureAwait(false);
@@ -110,8 +101,6 @@ namespace Emby.Server.Implementations.ScheduledTasks
{
Logger.Info("A new version of " + _appHost.Name + " is available.");
}
-
- progress.Report(100);
}
///
diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs
index 717416da1b..6e37c1dc12 100644
--- a/Emby.Server.Implementations/Updates/InstallationManager.cs
+++ b/Emby.Server.Implementations/Updates/InstallationManager.cs
@@ -513,8 +513,6 @@ namespace Emby.Server.Implementations.Updates
CurrentInstallations.Remove(tuple);
}
- progress.Report(100);
-
CompletedInstallationsInternal.Add(installationInfo);
EventHelper.FireEventIfNotNull(PackageInstallationCompleted, this, installationEventArgs, _logger);
diff --git a/MediaBrowser.Api/EnvironmentService.cs b/MediaBrowser.Api/EnvironmentService.cs
index c4cb0cb1d6..9764a71dbc 100644
--- a/MediaBrowser.Api/EnvironmentService.cs
+++ b/MediaBrowser.Api/EnvironmentService.cs
@@ -50,6 +50,20 @@ namespace MediaBrowser.Api
}
}
+ [Route("/Environment/ValidatePath", "POST", Summary = "Gets the contents of a given directory in the file system")]
+ public class ValidatePath
+ {
+ ///
+ /// Gets or sets the path.
+ ///
+ /// The path.
+ [ApiMember(Name = "Path", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
+ public string Path { get; set; }
+
+ public bool ValidateWriteable { get; set; }
+ public bool? IsFile { get; set; }
+ }
+
[Route("/Environment/NetworkShares", "GET", Summary = "Gets shares from a network device")]
public class GetNetworkShares : IReturn>
{
@@ -112,7 +126,7 @@ namespace MediaBrowser.Api
/// The _network manager
///
private readonly INetworkManager _networkManager;
- private IFileSystem _fileSystem;
+ private readonly IFileSystem _fileSystem;
///
/// Initializes a new instance of the class.
@@ -129,6 +143,48 @@ namespace MediaBrowser.Api
_fileSystem = fileSystem;
}
+ public void Post(ValidatePath request)
+ {
+ if (request.IsFile.HasValue)
+ {
+ if (request.IsFile.Value)
+ {
+ if (!_fileSystem.FileExists(request.Path))
+ {
+ throw new FileNotFoundException("File not found", request.Path);
+ }
+ }
+ else
+ {
+ if (!_fileSystem.DirectoryExists(request.Path))
+ {
+ throw new FileNotFoundException("File not found", request.Path);
+ }
+ }
+ }
+
+ else
+ {
+ if (!_fileSystem.FileExists(request.Path) && !_fileSystem.DirectoryExists(request.Path))
+ {
+ throw new FileNotFoundException("Path not found", request.Path);
+ }
+
+ if (request.ValidateWriteable)
+ {
+ EnsureWriteAccess(request.Path);
+ }
+ }
+ }
+
+ protected void EnsureWriteAccess(string path)
+ {
+ var file = Path.Combine(path, Guid.NewGuid().ToString());
+
+ _fileSystem.WriteAllText(file, string.Empty);
+ _fileSystem.DeleteFile(file);
+ }
+
public object Get(GetDefaultDirectoryBrowser request)
{
var result = new DefaultDirectoryBrowserInfo();