diff --git a/Emby.Common.Implementations/IO/ManagedFileSystem.cs b/Emby.Common.Implementations/IO/ManagedFileSystem.cs
index 5b965efdc..37b457598 100644
--- a/Emby.Common.Implementations/IO/ManagedFileSystem.cs
+++ b/Emby.Common.Implementations/IO/ManagedFileSystem.cs
@@ -419,6 +419,25 @@ namespace Emby.Common.Implementations.IO
}
}
+ public void SetReadOnly(string path, bool isReadOnly)
+ {
+ var info = GetFileInfo(path);
+
+ if (info.Exists && info.IsReadOnly != isReadOnly)
+ {
+ if (isReadOnly)
+ {
+ File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.ReadOnly);
+ }
+ else
+ {
+ FileAttributes attributes = File.GetAttributes(path);
+ attributes = RemoveAttribute(attributes, FileAttributes.ReadOnly);
+ File.SetAttributes(path, attributes);
+ }
+ }
+ }
+
private static FileAttributes RemoveAttribute(FileAttributes attributes, FileAttributes attributesToRemove)
{
return attributes & ~attributesToRemove;
@@ -564,6 +583,20 @@ namespace Emby.Common.Implementations.IO
public void DeleteFile(string path)
{
+ var fileInfo = GetFileInfo(path);
+
+ if (fileInfo.Exists)
+ {
+ if (fileInfo.IsHidden)
+ {
+ SetHidden(path, false);
+ }
+ if (fileInfo.IsReadOnly)
+ {
+ SetReadOnly(path, false);
+ }
+ }
+
File.Delete(path);
}
diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
index 806702dfd..7e885b779 100644
--- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj
+++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
@@ -51,6 +51,7 @@
+
@@ -187,6 +188,7 @@
+
diff --git a/Emby.Server.Implementations/EntryPoints/KeepServerAwake.cs b/Emby.Server.Implementations/EntryPoints/KeepServerAwake.cs
new file mode 100644
index 000000000..8ae85e390
--- /dev/null
+++ b/Emby.Server.Implementations/EntryPoints/KeepServerAwake.cs
@@ -0,0 +1,65 @@
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Plugins;
+using MediaBrowser.Controller.Session;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Linq;
+using MediaBrowser.Model.System;
+using MediaBrowser.Model.Threading;
+
+namespace Emby.Server.Implementations.EntryPoints
+{
+ public class KeepServerAwake : IServerEntryPoint
+ {
+ private readonly ISessionManager _sessionManager;
+ private readonly ILogger _logger;
+ private ITimer _timer;
+ private readonly IServerApplicationHost _appHost;
+ private readonly ITimerFactory _timerFactory;
+ private readonly IPowerManagement _powerManagement;
+
+ public KeepServerAwake(ISessionManager sessionManager, ILogger logger, IServerApplicationHost appHost, ITimerFactory timerFactory, IPowerManagement powerManagement)
+ {
+ _sessionManager = sessionManager;
+ _logger = logger;
+ _appHost = appHost;
+ _timerFactory = timerFactory;
+ _powerManagement = powerManagement;
+ }
+
+ public void Run()
+ {
+ _timer = _timerFactory.Create(OnTimerCallback, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
+ }
+
+ private void OnTimerCallback(object state)
+ {
+ var now = DateTime.UtcNow;
+
+ try
+ {
+ if (_sessionManager.Sessions.Any(i => (now - i.LastActivityDate).TotalMinutes < 15))
+ {
+ _powerManagement.PreventSystemStandby();
+ }
+ else
+ {
+ _powerManagement.AllowSystemStandby();
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error resetting system standby timer", ex);
+ }
+ }
+
+ public void Dispose()
+ {
+ if (_timer != null)
+ {
+ _timer.Dispose();
+ _timer = null;
+ }
+ }
+ }
+}
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
index 5d70d0383..5e55b893f 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
@@ -177,6 +177,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
inputModifiers = "-ss " + _mediaEncoder.GetTimeParameter(startTimeTicks) + " " + inputModifiers;
}
+ var analyzeDurationSeconds = 5;
+ var analyzeDuration = " -analyzeduration " +
+ (analyzeDurationSeconds * 1000000).ToString(CultureInfo.InvariantCulture);
+ inputModifiers += analyzeDuration;
+
commandLineArgs = string.Format(commandLineArgs, inputTempFile, targetFile, videoArgs, GetAudioArgs(mediaSource), durationParam);
return inputModifiers + " " + commandLineArgs;
diff --git a/MediaBrowser.Server.Implementations/Social/SharingManager.cs b/Emby.Server.Implementations/Social/SharingManager.cs
similarity index 91%
rename from MediaBrowser.Server.Implementations/Social/SharingManager.cs
rename to Emby.Server.Implementations/Social/SharingManager.cs
index 0bab7a70d..54614c879 100644
--- a/MediaBrowser.Server.Implementations/Social/SharingManager.cs
+++ b/Emby.Server.Implementations/Social/SharingManager.cs
@@ -7,16 +7,16 @@ using MediaBrowser.Model.Social;
using System;
using System.Threading.Tasks;
-namespace MediaBrowser.Server.Implementations.Social
+namespace Emby.Server.Implementations.Social
{
public class SharingManager : ISharingManager
{
- private readonly SharingRepository _repository;
+ private readonly ISharingRepository _repository;
private readonly IServerConfigurationManager _config;
private readonly ILibraryManager _libraryManager;
private readonly IServerApplicationHost _appHost;
- public SharingManager(SharingRepository repository, IServerConfigurationManager config, ILibraryManager libraryManager, IServerApplicationHost appHost)
+ public SharingManager(ISharingRepository repository, IServerConfigurationManager config, ILibraryManager libraryManager, IServerApplicationHost appHost)
{
_repository = repository;
_config = config;
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 433fdbe16..b079da97c 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -1892,19 +1892,7 @@ namespace MediaBrowser.Controller.Entities
if (info.IsLocalFile)
{
- // Delete the source file
- var currentFile = FileSystem.GetFileInfo(info.Path);
-
- // Deletion will fail if the file is hidden so remove the attribute first
- if (currentFile.Exists)
- {
- if (currentFile.IsHidden)
- {
- FileSystem.SetHidden(currentFile.FullName, false);
- }
-
- FileSystem.DeleteFile(currentFile.FullName);
- }
+ FileSystem.DeleteFile(info.Path);
}
return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None);
diff --git a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
index c489b5728..02c34320b 100644
--- a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
+++ b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
@@ -226,9 +226,12 @@ namespace MediaBrowser.LocalMetadata.Savers
if (file.IsHidden)
{
FileSystem.SetHidden(path, false);
-
wasHidden = true;
}
+ if (file.IsReadOnly)
+ {
+ FileSystem.SetReadOnly(path, false);
+ }
}
using (var filestream = FileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index b1e52dc7b..9715a624f 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -8,6 +8,9 @@ namespace MediaBrowser.Model.Configuration
///
public class ServerConfiguration : BaseApplicationConfiguration
{
+ public const int DefaultHttpPort = 8096;
+ public const int DefaultHttpsPort = 8920;
+
///
/// Gets or sets a value indicating whether [enable u pn p].
///
@@ -225,10 +228,10 @@ namespace MediaBrowser.Model.Configuration
EnableExternalContentInSuggestions = true;
ImageSavingConvention = ImageSavingConvention.Compatible;
- PublicPort = 8096;
- PublicHttpsPort = 8920;
- HttpServerPortNumber = 8096;
- HttpsPortNumber = 8920;
+ PublicPort = DefaultHttpPort;
+ PublicHttpsPort = DefaultHttpsPort;
+ HttpServerPortNumber = DefaultHttpPort;
+ HttpsPortNumber = DefaultHttpsPort;
EnableHttps = false;
EnableDashboardResponseCaching = true;
EnableDashboardResourceMinification = true;
diff --git a/MediaBrowser.Model/IO/IFileSystem.cs b/MediaBrowser.Model/IO/IFileSystem.cs
index ca537752a..d2bb35520 100644
--- a/MediaBrowser.Model/IO/IFileSystem.cs
+++ b/MediaBrowser.Model/IO/IFileSystem.cs
@@ -305,6 +305,7 @@ namespace MediaBrowser.Model.IO
IEnumerable GetFileSystemEntryPaths(string path, bool recursive = false);
void SetHidden(string path, bool isHidden);
+ void SetReadOnly(string path, bool isHidden);
char DirectorySeparatorChar { get; }
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index ee7582619..64472ca3a 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -143,7 +143,9 @@
+
+
diff --git a/MediaBrowser.Model/Social/ISharingRepository.cs b/MediaBrowser.Model/Social/ISharingRepository.cs
new file mode 100644
index 000000000..069b6e1fe
--- /dev/null
+++ b/MediaBrowser.Model/Social/ISharingRepository.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Model.Social
+{
+ public interface ISharingRepository
+ {
+ Task CreateShare(SocialShareInfo info);
+ Task DeleteShare(string id);
+ SocialShareInfo GetShareInfo(string id);
+ }
+}
diff --git a/MediaBrowser.Model/System/IPowerManagement.cs b/MediaBrowser.Model/System/IPowerManagement.cs
new file mode 100644
index 000000000..91cae0d3e
--- /dev/null
+++ b/MediaBrowser.Model/System/IPowerManagement.cs
@@ -0,0 +1,9 @@
+
+namespace MediaBrowser.Model.System
+{
+ public interface IPowerManagement
+ {
+ void PreventSystemStandby();
+ void AllowSystemStandby();
+ }
+}
diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs
index 59d67740d..b59875378 100644
--- a/MediaBrowser.Providers/Manager/ImageSaver.cs
+++ b/MediaBrowser.Providers/Manager/ImageSaver.cs
@@ -265,6 +265,10 @@ namespace MediaBrowser.Providers.Manager
{
_fileSystem.SetHidden(file.FullName, false);
}
+ if (file.IsReadOnly)
+ {
+ _fileSystem.SetReadOnly(path, false);
+ }
}
using (var fs = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
index 7ef8c464e..5d9d05034 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
@@ -134,8 +134,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer
base.OnConfigLoad();
Config.HandlerFactoryPath = null;
-
- Config.MetadataRedirectPath = "metadata";
}
protected override ServiceController CreateServiceController(params Assembly[] assembliesWithServices)
@@ -574,7 +572,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer
{
httpRes.StatusCode = 302;
httpRes.AddHeader(HttpHeaders.Location, url);
- httpRes.EndRequest();
}
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 4096d71dc..3d38c2e3c 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -146,7 +146,6 @@
-
diff --git a/MediaBrowser.Server.Implementations/Social/SharingRepository.cs b/MediaBrowser.Server.Implementations/Social/SharingRepository.cs
index c4243c1a7..dec43e4cb 100644
--- a/MediaBrowser.Server.Implementations/Social/SharingRepository.cs
+++ b/MediaBrowser.Server.Implementations/Social/SharingRepository.cs
@@ -10,7 +10,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Social
{
- public class SharingRepository : BaseSqliteRepository
+ public class SharingRepository : BaseSqliteRepository, ISharingRepository
{
public SharingRepository(ILogManager logManager, IApplicationPaths appPaths, IDbConnector dbConnector)
: base(logManager, dbConnector)
diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
index fcaeb035d..b7dbe4dc7 100644
--- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
+++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
@@ -100,6 +100,7 @@
+
diff --git a/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs b/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs
index 73e2686d2..46605e19f 100644
--- a/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs
+++ b/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs
@@ -68,16 +68,6 @@ namespace MediaBrowser.Server.Mono.Native
get { return false; }
}
- public void PreventSystemStandby()
- {
-
- }
-
- public void AllowSystemStandby()
- {
-
- }
-
public List GetAssembliesWithParts()
{
var list = new List();
diff --git a/MediaBrowser.Server.Mono/Native/PowerManagement.cs b/MediaBrowser.Server.Mono/Native/PowerManagement.cs
new file mode 100644
index 000000000..0fdd4de80
--- /dev/null
+++ b/MediaBrowser.Server.Mono/Native/PowerManagement.cs
@@ -0,0 +1,15 @@
+using MediaBrowser.Model.System;
+
+namespace MediaBrowser.Server.Mono.Native
+{
+ public class PowerManagement : IPowerManagement
+ {
+ public void PreventSystemStandby()
+ {
+ }
+
+ public void AllowSystemStandby()
+ {
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Mono/Program.cs b/MediaBrowser.Server.Mono/Program.cs
index 215ee4468..662d82ff0 100644
--- a/MediaBrowser.Server.Mono/Program.cs
+++ b/MediaBrowser.Server.Mono/Program.cs
@@ -80,7 +80,7 @@ namespace MediaBrowser.Server.Mono
var nativeApp = new NativeApp(options, logManager.GetLogger("App"));
- _appHost = new ApplicationHost(appPaths, logManager, options, fileSystem, "emby.mono.zip", nativeApp);
+ _appHost = new ApplicationHost(appPaths, logManager, options, fileSystem, nativeApp, new PowerManagement(), "emby.mono.zip");
if (options.ContainsOption("-v"))
{
diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
index c0f184bef..c09e028ea 100644
--- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
+++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
@@ -114,10 +114,12 @@ using Emby.Server.Implementations.Playlists;
using Emby.Server.Implementations.Security;
using Emby.Server.Implementations.ServerManager;
using Emby.Server.Implementations.Session;
+using Emby.Server.Implementations.Social;
using Emby.Server.Implementations.Sync;
using Emby.Server.Implementations.TV;
using Emby.Server.Implementations.Updates;
using MediaBrowser.Model.Activity;
+using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Net;
@@ -259,26 +261,24 @@ namespace MediaBrowser.Server.Startup.Common
internal INativeApp NativeApp { get; set; }
+ internal IPowerManagement PowerManagement { get; private set; }
+
///
/// Initializes a new instance of the class.
///
- /// The application paths.
- /// The log manager.
- /// The options.
- /// The file system.
- /// The release asset filename.
- /// The native application.
public ApplicationHost(ServerApplicationPaths applicationPaths,
ILogManager logManager,
StartupOptions options,
IFileSystem fileSystem,
- string releaseAssetFilename,
- INativeApp nativeApp)
+ INativeApp nativeApp,
+ IPowerManagement powerManagement,
+ string releaseAssetFilename)
: base(applicationPaths, logManager, fileSystem)
{
_startupOptions = options;
_releaseAssetFilename = releaseAssetFilename;
NativeApp = nativeApp;
+ PowerManagement = powerManagement;
SetBaseExceptionMessage();
}
@@ -484,6 +484,13 @@ namespace MediaBrowser.Server.Startup.Common
HttpPort = ServerConfigurationManager.Configuration.HttpServerPortNumber;
HttpsPort = ServerConfigurationManager.Configuration.HttpsPortNumber;
+ // Safeguard against invalid configuration
+ if (HttpPort == HttpsPort)
+ {
+ HttpPort = ServerConfiguration.DefaultHttpPort;
+ HttpsPort = ServerConfiguration.DefaultHttpsPort;
+ }
+
return base.Init(progress);
}
@@ -534,6 +541,8 @@ namespace MediaBrowser.Server.Startup.Common
{
await base.RegisterResources(progress).ConfigureAwait(false);
+ RegisterSingleInstance(PowerManagement);
+
SecurityManager = new PluginSecurityManager(this, HttpClient, JsonSerializer, ApplicationPaths, LogManager, FileSystemManager, CryptographyProvider);
RegisterSingleInstance(SecurityManager);
@@ -998,13 +1007,13 @@ namespace MediaBrowser.Server.Startup.Common
{
Logger.ErrorException("Error starting http server", ex);
- if (HttpPort == 8096)
+ if (HttpPort == ServerConfiguration.DefaultHttpPort)
{
throw;
}
}
- HttpPort = 8096;
+ HttpPort = ServerConfiguration.DefaultHttpPort;
try
{
diff --git a/MediaBrowser.Server.Startup.Common/EntryPoints/KeepServerAwake.cs b/MediaBrowser.Server.Startup.Common/EntryPoints/KeepServerAwake.cs
deleted file mode 100644
index 95b42afbf..000000000
--- a/MediaBrowser.Server.Startup.Common/EntryPoints/KeepServerAwake.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Controller.Session;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Linq;
-using MediaBrowser.Server.Startup.Common.Threading;
-
-namespace MediaBrowser.Server.Startup.Common.EntryPoints
-{
- public class KeepServerAwake : IServerEntryPoint
- {
- private readonly ISessionManager _sessionManager;
- private readonly ILogger _logger;
- private PeriodicTimer _timer;
- private readonly IServerApplicationHost _appHost;
-
- public KeepServerAwake(ISessionManager sessionManager, ILogger logger, IServerApplicationHost appHost)
- {
- _sessionManager = sessionManager;
- _logger = logger;
- _appHost = appHost;
- }
-
- public void Run()
- {
- _timer = new PeriodicTimer(obj =>
- {
- var now = DateTime.UtcNow;
- var nativeApp = ((ApplicationHost)_appHost).NativeApp;
-
- try
- {
- if (_sessionManager.Sessions.Any(i => (now - i.LastActivityDate).TotalMinutes < 15))
- {
- nativeApp.PreventSystemStandby();
- }
- else
- {
- nativeApp.AllowSystemStandby();
- }
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error resetting system standby timer", ex);
- }
-
- }, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
- }
-
- public void Dispose()
- {
- if (_timer != null)
- {
- _timer.Dispose();
- _timer = null;
- }
- }
- }
-}
diff --git a/MediaBrowser.Server.Startup.Common/INativeApp.cs b/MediaBrowser.Server.Startup.Common/INativeApp.cs
index c56bb9b4b..df29dfde4 100644
--- a/MediaBrowser.Server.Startup.Common/INativeApp.cs
+++ b/MediaBrowser.Server.Startup.Common/INativeApp.cs
@@ -88,13 +88,6 @@ namespace MediaBrowser.Server.Startup.Common
/// INetworkManager.
INetworkManager CreateNetworkManager(ILogger logger);
- ///
- /// Prevents the system stand by.
- ///
- void PreventSystemStandby();
-
- void AllowSystemStandby();
-
FFMpegInstallInfo GetFfmpegInstallInfo();
void LaunchUrl(string url);
diff --git a/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj b/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj
index aca30aa2c..97cdddf26 100644
--- a/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj
+++ b/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj
@@ -75,7 +75,6 @@
-
@@ -90,7 +89,6 @@
-
diff --git a/MediaBrowser.Server.Startup.Common/Threading/PeriodicTimer.cs b/MediaBrowser.Server.Startup.Common/Threading/PeriodicTimer.cs
deleted file mode 100644
index 3e898adfd..000000000
--- a/MediaBrowser.Server.Startup.Common/Threading/PeriodicTimer.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-using System.Threading;
-using Microsoft.Win32;
-
-namespace MediaBrowser.Server.Startup.Common.Threading
-{
- public class PeriodicTimer : IDisposable
- {
- public Action