using System; using System.Collections.Generic; using System.Reflection; using Emby.Server.Core; using Emby.Server.Implementations; using Emby.Server.Implementations.FFMpeg; using MediaBrowser.IsoMounter; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.System; namespace MediaBrowser.Server.Mono { public class MonoAppHost : ApplicationHost { public MonoAppHost(ServerApplicationPaths applicationPaths, ILogManager logManager, StartupOptions options, IFileSystem fileSystem, IPowerManagement powerManagement, string releaseAssetFilename, IEnvironmentInfo environmentInfo, MediaBrowser.Controller.Drawing.IImageEncoder imageEncoder, ISystemEvents systemEvents, IMemoryStreamFactory memoryStreamFactory, MediaBrowser.Common.Net.INetworkManager networkManager, Action certificateGenerator, Func defaultUsernameFactory) : base(applicationPaths, logManager, options, fileSystem, powerManagement, releaseAssetFilename, environmentInfo, imageEncoder, systemEvents, memoryStreamFactory, networkManager, certificateGenerator, defaultUsernameFactory) { } public override bool CanSelfRestart { get { // A restart script must be provided return StartupOptions.ContainsOption("-restartpath"); } } public override bool CanSelfUpdate { get { return false; } } protected override FFMpegInstallInfo GetFfmpegInstallInfo() { var info = new FFMpegInstallInfo(); // Windows builds: http://ffmpeg.zeranoe.com/builds/ // Linux builds: http://johnvansickle.com/ffmpeg/ // OS X builds: http://ffmpegmac.net/ // OS X x64: http://www.evermeet.cx/ffmpeg/ var environment = (MonoEnvironmentInfo) EnvironmentInfo; if (environment.IsBsd) { } else if (environment.OperatingSystem == Model.System.OperatingSystem.Linux) { info.FFMpegFilename = "ffmpeg"; info.FFProbeFilename = "ffprobe"; info.ArchiveType = "7z"; info.Version = "20160215"; info.DownloadUrls = GetDownloadUrls(); } // No version available - user requirement info.DownloadUrls = new string[] { }; return info; } private string[] GetDownloadUrls() { switch (EnvironmentInfo.SystemArchitecture) { case Architecture.X64: return new[] { "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/linux/ffmpeg-git-20160215-64bit-static.7z" }; case Architecture.X86: return new[] { "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/linux/ffmpeg-git-20160215-32bit-static.7z" }; } return new string[] { }; } protected override void RestartInternal() { MainClass.Restart(StartupOptions); } protected override List GetAssembliesWithPartsInternal() { var list = new List(); list.Add(GetType().Assembly); list.AddRange(GetLinuxAssemblies()); return list; } private IEnumerable GetLinuxAssemblies() { var list = new List(); list.Add(typeof(LinuxIsoManager).Assembly); return list; } protected override void ShutdownInternal() { MainClass.Shutdown(); } protected override bool SupportsDualModeSockets { get { return GetMonoVersion() >= new Version(4, 6); } } private static Version GetMonoVersion() { Type type = Type.GetType("Mono.Runtime"); if (type != null) { MethodInfo displayName = type.GetTypeInfo().GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static); var displayNameValue = displayName.Invoke(null, null).ToString().Trim().Split(' ')[0]; Version version; if (Version.TryParse(displayNameValue, out version)) { return version; } } return new Version(1, 0); } protected override void AuthorizeServer() { throw new NotImplementedException(); } protected override void ConfigureAutoRunInternal(bool autorun) { throw new NotImplementedException(); } protected override void EnableLoopbackInternal(string appName) { } public override bool SupportsRunningAsService { get { return false; } } public override bool SupportsAutoRunAtStartup { get { return false; } } public override bool IsRunningAsService { get { return false; } } } }