diff options
| author | Luke <luke.pulverenti@gmail.com> | 2016-12-18 00:44:33 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-12-18 00:44:33 -0500 |
| commit | e7cebb91a73354dc3e0d0b6340c9fbd6511f4406 (patch) | |
| tree | 6f1c368c766c17b7514fe749c0e92e69cd89194a /src | |
| parent | 025905a3e4d50b9a2e07fbf4ff0a203af6604ced (diff) | |
| parent | aaa027f3229073e9a40756c3157d41af2a442922 (diff) | |
Merge pull request #2350 from MediaBrowser/beta
Beta
Diffstat (limited to 'src')
| -rw-r--r-- | src/Emby.Server/ApplicationPathHelper.cs | 40 | ||||
| -rw-r--r-- | src/Emby.Server/CoreAppHost.cs | 133 | ||||
| -rw-r--r-- | src/Emby.Server/CoreSystemEvents.cs | 13 | ||||
| -rw-r--r-- | src/Emby.Server/Emby.Server.xproj | 46 | ||||
| -rw-r--r-- | src/Emby.Server/IO/MemoryStreamFactory.cs | 33 | ||||
| -rw-r--r-- | src/Emby.Server/PowerManagement.cs | 15 | ||||
| -rw-r--r-- | src/Emby.Server/Program.cs | 346 | ||||
| -rw-r--r-- | src/Emby.Server/Properties/AssemblyInfo.cs | 19 | ||||
| -rw-r--r-- | src/Emby.Server/project.json | 125 |
9 files changed, 770 insertions, 0 deletions
diff --git a/src/Emby.Server/ApplicationPathHelper.cs b/src/Emby.Server/ApplicationPathHelper.cs new file mode 100644 index 000000000..c611ff372 --- /dev/null +++ b/src/Emby.Server/ApplicationPathHelper.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace Emby.Server +{ + public class ApplicationPathHelper + { + public static string GetProgramDataPath(string appDirectory) + { + var useDebugPath = false; + +#if DEBUG + useDebugPath = true; +#endif + + var programDataPath = useDebugPath ? + "programdata" : + "programdata"; + + programDataPath = programDataPath + .Replace('/', Path.DirectorySeparatorChar) + .Replace('\\', Path.DirectorySeparatorChar); + + // If it's a relative path, e.g. "..\" + if (!Path.IsPathRooted(programDataPath)) + { + programDataPath = Path.Combine(appDirectory, programDataPath); + + programDataPath = Path.GetFullPath(programDataPath); + } + + Directory.CreateDirectory(programDataPath); + + return programDataPath; + } + } +} diff --git a/src/Emby.Server/CoreAppHost.cs b/src/Emby.Server/CoreAppHost.cs new file mode 100644 index 000000000..09df664fa --- /dev/null +++ b/src/Emby.Server/CoreAppHost.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using Emby.Server.Core; +using Emby.Server.Implementations.FFMpeg; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.System; +using Emby.Server.Implementations; + +namespace Emby.Server +{ + public class CoreAppHost : ApplicationHost + { + public CoreAppHost(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<string, string> certificateGenerator, Func<string> defaultUsernameFactory) + : base(applicationPaths, logManager, options, fileSystem, powerManagement, releaseAssetFilename, environmentInfo, imageEncoder, systemEvents, memoryStreamFactory, networkManager, certificateGenerator, defaultUsernameFactory) + { + } + + public override bool IsRunningAsService + { + get { return false; } + } + + protected override void RestartInternal() + { + Program.Restart(); + } + + protected override void ShutdownInternal() + { + Program.Shutdown(); + } + + protected override FFMpegInstallInfo GetFfmpegInstallInfo() + { + var info = new FFMpegInstallInfo(); + + if (EnvironmentInfo.OperatingSystem == OperatingSystem.Windows) + { + info.FFMpegFilename = "ffmpeg.exe"; + info.FFProbeFilename = "ffprobe.exe"; + info.Version = "20160410"; + info.ArchiveType = "7z"; + info.DownloadUrls = GetDownloadUrls(); + } + + return info; + } + + private string[] GetDownloadUrls() + { + switch (EnvironmentInfo.SystemArchitecture) + { + case Architecture.X64: + return new[] + { + "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win64.7z" + }; + case Architecture.X86: + return new[] + { + "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win32.7z" + }; + } + + return new string[] { }; + } + + protected override List<Assembly> GetAssembliesWithPartsInternal() + { + var list = new List<Assembly>(); + + list.Add(GetType().GetTypeInfo().Assembly); + + return list; + } + + protected override void AuthorizeServer() + { + } + + protected override void ConfigureAutoRunInternal(bool autorun) + { + } + + protected override void EnableLoopbackInternal(string appName) + { + } + + public override bool SupportsRunningAsService + { + get + { + return true; + } + } + + public override bool CanSelfRestart + { + get + { + return Program.CanSelfRestart; + } + } + + public override bool SupportsAutoRunAtStartup + { + get + { + return true; + } + } + + public override bool CanSelfUpdate + { + get + { + return Program.CanSelfUpdate; + } + } + + protected override bool SupportsDualModeSockets + { + get + { + return true; + } + } + } +} diff --git a/src/Emby.Server/CoreSystemEvents.cs b/src/Emby.Server/CoreSystemEvents.cs new file mode 100644 index 000000000..7afb94160 --- /dev/null +++ b/src/Emby.Server/CoreSystemEvents.cs @@ -0,0 +1,13 @@ +using System; +using MediaBrowser.Model.System; + +namespace Emby.Server +{ + public class CoreSystemEvents : ISystemEvents + { + public event EventHandler Resume; + public event EventHandler Suspend; + public event EventHandler SessionLogoff; + public event EventHandler SystemShutdown; + } +} diff --git a/src/Emby.Server/Emby.Server.xproj b/src/Emby.Server/Emby.Server.xproj new file mode 100644 index 000000000..2462c5179 --- /dev/null +++ b/src/Emby.Server/Emby.Server.xproj @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion> + <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> + </PropertyGroup> + <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" /> + <PropertyGroup Label="Globals"> + <ProjectGuid>ddaff431-0b3d-4857-8762-990a32dc8472</ProjectGuid> + <RootNamespace>Emby.Server</RootNamespace> + <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath> + <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath> + <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> + </PropertyGroup> + <PropertyGroup> + <SchemaVersion>2.0</SchemaVersion> + </PropertyGroup> + <ItemGroup> + <ProjectReference Include="..\..\BDInfo\BDInfo.csproj" /> + <ProjectReference Include="..\..\DvdLib\DvdLib.csproj" /> + <ProjectReference Include="..\..\Emby.Dlna\Emby.Dlna.csproj" /> + <ProjectReference Include="..\..\Emby.Drawing\Emby.Drawing.csproj" /> + <ProjectReference Include="..\..\Emby.Photos\Emby.Photos.csproj" /> + <ProjectReference Include="..\..\Emby.Server.Implementations\Emby.Server.Implementations.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.Api\MediaBrowser.Api.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.Common\MediaBrowser.Common.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.Controller\MediaBrowser.Controller.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.Model\MediaBrowser.Model.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.Providers\MediaBrowser.Providers.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj" /> + <ProjectReference Include="..\..\MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj" /> + <ProjectReference Include="..\..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj" /> + <ProjectReference Include="..\..\RSSDP\RSSDP.csproj" /> + <ProjectReference Include="..\..\ServiceStack\ServiceStack.csproj" /> + <ProjectReference Include="..\..\SocketHttpListener.Portable\SocketHttpListener.Portable.csproj" /> + </ItemGroup> + <ItemGroup> + <Compile Include="..\..\SharedVersion.cs"> + <Link>Properties\SharedVersion.cs</Link> + </Compile> + </ItemGroup> + <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" /> +</Project>
\ No newline at end of file diff --git a/src/Emby.Server/IO/MemoryStreamFactory.cs b/src/Emby.Server/IO/MemoryStreamFactory.cs new file mode 100644 index 000000000..37ac2959e --- /dev/null +++ b/src/Emby.Server/IO/MemoryStreamFactory.cs @@ -0,0 +1,33 @@ +using System; +using System.IO; +using MediaBrowser.Model.IO; + +namespace Emby.Server.IO +{ + public class MemoryStreamFactory : IMemoryStreamFactory + { + public MemoryStream CreateNew() + { + return new MemoryStream(); + } + + public MemoryStream CreateNew(int capacity) + { + return new MemoryStream(capacity); + } + + public MemoryStream CreateNew(byte[] buffer) + { + return new MemoryStream(buffer); + } + + public bool TryGetBuffer(MemoryStream stream, out byte[] buffer) + { + ArraySegment<byte> arrayBuffer; + stream.TryGetBuffer(out arrayBuffer); + + buffer = arrayBuffer.Array; + return true; + } + } +} diff --git a/src/Emby.Server/PowerManagement.cs b/src/Emby.Server/PowerManagement.cs new file mode 100644 index 000000000..85e3b72a6 --- /dev/null +++ b/src/Emby.Server/PowerManagement.cs @@ -0,0 +1,15 @@ +using MediaBrowser.Model.System; + +namespace Emby.Server +{ + public class PowerManagement : IPowerManagement + { + public void PreventSystemStandby() + { + } + + public void AllowSystemStandby() + { + } + } +} diff --git a/src/Emby.Server/Program.cs b/src/Emby.Server/Program.cs new file mode 100644 index 000000000..26141a0ce --- /dev/null +++ b/src/Emby.Server/Program.cs @@ -0,0 +1,346 @@ +using MediaBrowser.Model.Logging; +using MediaBrowser.Server.Implementations; +using Microsoft.Win32; +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Emby.Common.Implementations.EnvironmentInfo; +using Emby.Common.Implementations.IO; +using Emby.Common.Implementations.Logging; +using Emby.Common.Implementations.Networking; +using Emby.Drawing; +using Emby.Server.Core; +using Emby.Server.Implementations.Browser; +using Emby.Server.Implementations.IO; +using MediaBrowser.Common.Net; +using Emby.Server.IO; +using Emby.Server.Implementations; + +namespace Emby.Server +{ + public class Program + { + private static ApplicationHost _appHost; + + private static ILogger _logger; + + private static bool _appHostDisposed; + + [DllImport("kernel32.dll", SetLastError = true)] + static extern bool SetDllDirectory(string lpPathName); + + /// <summary> + /// Defines the entry point of the application. + /// </summary> + public static void Main(string[] args) + { + var options = new StartupOptions(Environment.GetCommandLineArgs()); + + var environmentInfo = new EnvironmentInfo(); + + var baseDirectory = System.AppContext.BaseDirectory; + string archPath = baseDirectory; + if (environmentInfo.SystemArchitecture == MediaBrowser.Model.System.Architecture.X64) + { + archPath = Path.Combine(archPath, "x64"); + } + else if (environmentInfo.SystemArchitecture == MediaBrowser.Model.System.Architecture.X86) + { + archPath = Path.Combine(archPath, "x86"); + } + else + { + archPath = Path.Combine(archPath, "arm"); + } + + //Wand.SetMagickCoderModulePath(architecturePath); + + if (environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows) + { + SetDllDirectory(archPath); + } + + var appPaths = CreateApplicationPaths(baseDirectory); + SetSqliteProvider(); + + var logManager = new NlogManager(appPaths.LogDirectoryPath, "server"); + logManager.ReloadLogger(LogSeverity.Debug); + logManager.AddConsoleOutput(); + + var logger = _logger = logManager.GetLogger("Main"); + + ApplicationHost.LogEnvironmentInfo(logger, appPaths, true); + + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + + //if (IsAlreadyRunning(applicationPath, currentProcess)) + //{ + // logger.Info("Shutting down because another instance of Emby Server is already running."); + // return; + //} + + if (PerformUpdateIfNeeded(appPaths, logger)) + { + logger.Info("Exiting to perform application update."); + return; + } + + RunApplication(appPaths, logManager, options, environmentInfo); + } + + private static void SetSqliteProvider() + { + SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3()); + } + + /// <summary> + /// Determines whether [is already running] [the specified current process]. + /// </summary> + /// <param name="applicationPath">The application path.</param> + /// <param name="currentProcess">The current process.</param> + /// <returns><c>true</c> if [is already running] [the specified current process]; otherwise, <c>false</c>.</returns> + private static bool IsAlreadyRunning(string applicationPath, Process currentProcess) + { + var duplicate = Process.GetProcesses().FirstOrDefault(i => + { + try + { + if (currentProcess.Id == i.Id) + { + return false; + } + } + catch (Exception) + { + return false; + } + + try + { + //_logger.Info("Module: {0}", i.MainModule.FileName); + if (string.Equals(applicationPath, i.MainModule.FileName, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + return false; + } + catch (Exception) + { + return false; + } + }); + + if (duplicate != null) + { + _logger.Info("Found a duplicate process. Giving it time to exit."); + + if (!duplicate.WaitForExit(30000)) + { + _logger.Info("The duplicate process did not exit."); + return true; + } + } + + return false; + } + + /// <summary> + /// Creates the application paths. + /// </summary> + private static ServerApplicationPaths CreateApplicationPaths(string appDirectory) + { + var resourcesPath = appDirectory; + + return new ServerApplicationPaths(ApplicationPathHelper.GetProgramDataPath(appDirectory), appDirectory, resourcesPath); + } + + /// <summary> + /// Gets a value indicating whether this instance can self restart. + /// </summary> + /// <value><c>true</c> if this instance can self restart; otherwise, <c>false</c>.</value> + public static bool CanSelfRestart + { + get + { + return true; + } + } + + /// <summary> + /// Gets a value indicating whether this instance can self update. + /// </summary> + /// <value><c>true</c> if this instance can self update; otherwise, <c>false</c>.</value> + public static bool CanSelfUpdate + { + get + { + return false; + } + } + + private static readonly TaskCompletionSource<bool> ApplicationTaskCompletionSource = new TaskCompletionSource<bool>(); + + /// <summary> + /// Runs the application. + /// </summary> + /// <param name="appPaths">The app paths.</param> + /// <param name="logManager">The log manager.</param> + /// <param name="options">The options.</param> + private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, StartupOptions options, EnvironmentInfo environmentInfo) + { + var fileSystem = new ManagedFileSystem(logManager.GetLogger("FileSystem"), true, true, true); + + fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem)); + + var imageEncoder = new NullImageEncoder(); + + _appHost = new CoreAppHost(appPaths, + logManager, + options, + fileSystem, + new PowerManagement(), + "emby.windows.zip", + environmentInfo, + imageEncoder, + new CoreSystemEvents(), + new MemoryStreamFactory(), + new NetworkManager(logManager.GetLogger("NetworkManager")), + GenerateCertificate, + () => "EmbyUser"); + + var initProgress = new Progress<double>(); + + if (environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows) + { + // Not crazy about this but it's the only way to suppress ffmpeg crash dialog boxes + SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT | + ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX); + } + + var task = _appHost.Init(initProgress); + Task.WaitAll(task); + + task = task.ContinueWith(new Action<Task>(a => _appHost.RunStartupTasks()), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent); + + Task.WaitAll(task); + + task = ApplicationTaskCompletionSource.Task; + Task.WaitAll(task); + } + + private static void GenerateCertificate(string certPath, string certHost) + { + //CertificateGenerator.CreateSelfSignCertificatePfx(certPath, certHost, _logger); + } + + /// <summary> + /// Handles the UnhandledException event of the CurrentDomain control. + /// </summary> + /// <param name="sender">The source of the event.</param> + /// <param name="e">The <see cref="UnhandledExceptionEventArgs"/> instance containing the event data.</param> + static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + var exception = (Exception)e.ExceptionObject; + + new UnhandledExceptionWriter(_appHost.ServerConfigurationManager.ApplicationPaths, _logger, _appHost.LogManager).Log(exception); + + ShowMessageBox("Unhandled exception: " + exception.Message); + + if (!Debugger.IsAttached) + { + Environment.Exit(Marshal.GetHRForException(exception)); + } + } + + /// <summary> + /// Performs the update if needed. + /// </summary> + /// <param name="appPaths">The app paths.</param> + /// <param name="logger">The logger.</param> + /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> + private static bool PerformUpdateIfNeeded(ServerApplicationPaths appPaths, ILogger logger) + { + return false; + } + + private static void ShowMessageBox(string msg) + { + + } + + public static void Shutdown() + { + DisposeAppHost(); + + //_logger.Info("Calling Application.Exit"); + //Application.Exit(); + + _logger.Info("Calling Environment.Exit"); + Environment.Exit(0); + + _logger.Info("Calling ApplicationTaskCompletionSource.SetResult"); + ApplicationTaskCompletionSource.SetResult(true); + } + + public static void Restart() + { + DisposeAppHost(); + + // todo: start new instance + + Shutdown(); + } + + private static void DisposeAppHost() + { + if (!_appHostDisposed) + { + _logger.Info("Disposing app host"); + + _appHostDisposed = true; + _appHost.Dispose(); + } + } + + /// <summary> + /// Sets the error mode. + /// </summary> + /// <param name="uMode">The u mode.</param> + /// <returns>ErrorModes.</returns> + [DllImport("kernel32.dll")] + static extern ErrorModes SetErrorMode(ErrorModes uMode); + + /// <summary> + /// Enum ErrorModes + /// </summary> + [Flags] + public enum ErrorModes : uint + { + /// <summary> + /// The SYSTE m_ DEFAULT + /// </summary> + SYSTEM_DEFAULT = 0x0, + /// <summary> + /// The SE m_ FAILCRITICALERRORS + /// </summary> + SEM_FAILCRITICALERRORS = 0x0001, + /// <summary> + /// The SE m_ NOALIGNMENTFAULTEXCEPT + /// </summary> + SEM_NOALIGNMENTFAULTEXCEPT = 0x0004, + /// <summary> + /// The SE m_ NOGPFAULTERRORBOX + /// </summary> + SEM_NOGPFAULTERRORBOX = 0x0002, + /// <summary> + /// The SE m_ NOOPENFILEERRORBOX + /// </summary> + SEM_NOOPENFILEERRORBOX = 0x8000 + } + } +} diff --git a/src/Emby.Server/Properties/AssemblyInfo.cs b/src/Emby.Server/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..2674312bb --- /dev/null +++ b/src/Emby.Server/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Emby.Server")] +[assembly: AssemblyTrademark("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ddaff431-0b3d-4857-8762-990a32dc8472")] diff --git a/src/Emby.Server/project.json b/src/Emby.Server/project.json new file mode 100644 index 000000000..e77506e92 --- /dev/null +++ b/src/Emby.Server/project.json @@ -0,0 +1,125 @@ +{ + "version": "3.1.0-*", + "buildOptions": { + "emitEntryPoint": true + }, + + "dependencies": { + "Emby.Common.Implementations": "1.0.0-*", + "Emby.Server.Core": "1.0.0-*", + "Microsoft.NETCore.App": { + "type": "platform", + "version": "1.1.0" + }, + "Mono.Nat": "1.0.0-*", + "System.Runtime.Extensions": "4.3.0", + "System.Diagnostics.Process": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "SQLitePCLRaw.provider.sqlite3.netstandard11": "1.1.1" + }, + + "runtimes": { + "win7-x86": {}, + "win7-x64": {}, + "win8-x86": {}, + "win8-x64": {}, + "win8-arm": {}, + "win81-x86": {}, + "win81-x64": {}, + "win81-arm": {}, + "win10-x86": {}, + "win10-x64": {}, + "win10-arm": {}, + "win10-arm64": {}, + "osx.10.10-x64": {}, + "osx.10.11-x64": {}, + "osx.10.12-x64": , + "rhel.7.0-x64": {}, + "rhel.7.1-x64": {}, + "rhel.7.2-x64": {}, + "ubuntu.14.04-x64": {}, + "ubuntu.14.10-x64": {}, + "ubuntu.15.04-x64": {}, + "ubuntu.15.10-x64": {}, + "ubuntu.16.04-x64": {}, + "ubuntu.16.10-x64": {}, + "centos.7-x64": {}, + "debian.8-x64": {}, + "fedora.23-x64": {}, + "fedora.24-x64": {}, + "opensuse.13.2-x64": {}, + "opensuse.42.1-x64": {}, + "ol.7-x64": {}, + "ol.7.0-x64": {}, + "ol.7.1-x64": {}, + "ol.7.2-x64": {} + }, + + "frameworks": { + "netcoreapp1.1": { + "imports": "dnxcore50", + "dependencies": { + "BDInfo": { + "target": "project" + }, + "DvdLib": { + "target": "project" + }, + "Emby.Dlna": { + "target": "project" + }, + "Emby.Drawing": { + "target": "project" + }, + "Emby.Photos": { + "target": "project" + }, + "Emby.Server.Implementations": { + "target": "project" + }, + "MediaBrowser.Api": { + "target": "project" + }, + "MediaBrowser.Common": { + "target": "project" + }, + "MediaBrowser.Controller": { + "target": "project" + }, + "MediaBrowser.LocalMetadata": { + "target": "project" + }, + "MediaBrowser.MediaEncoding": { + "target": "project" + }, + "MediaBrowser.Model": { + "target": "project" + }, + "MediaBrowser.Providers": { + "target": "project" + }, + "MediaBrowser.Server.Implementations": { + "target": "project" + }, + "MediaBrowser.WebDashboard": { + "target": "project" + }, + "MediaBrowser.XbmcMetadata": { + "target": "project" + }, + "OpenSubtitlesHandler": { + "target": "project" + }, + "RSSDP": { + "target": "project" + }, + "ServiceStack": { + "target": "project" + }, + "SocketHttpListener.Portable": { + "target": "project" + } + } + } + } +} |
