aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2016-12-18 00:44:33 -0500
committerGitHub <noreply@github.com>2016-12-18 00:44:33 -0500
commite7cebb91a73354dc3e0d0b6340c9fbd6511f4406 (patch)
tree6f1c368c766c17b7514fe749c0e92e69cd89194a /src
parent025905a3e4d50b9a2e07fbf4ff0a203af6604ced (diff)
parentaaa027f3229073e9a40756c3157d41af2a442922 (diff)
Merge pull request #2350 from MediaBrowser/beta
Beta
Diffstat (limited to 'src')
-rw-r--r--src/Emby.Server/ApplicationPathHelper.cs40
-rw-r--r--src/Emby.Server/CoreAppHost.cs133
-rw-r--r--src/Emby.Server/CoreSystemEvents.cs13
-rw-r--r--src/Emby.Server/Emby.Server.xproj46
-rw-r--r--src/Emby.Server/IO/MemoryStreamFactory.cs33
-rw-r--r--src/Emby.Server/PowerManagement.cs15
-rw-r--r--src/Emby.Server/Program.cs346
-rw-r--r--src/Emby.Server/Properties/AssemblyInfo.cs19
-rw-r--r--src/Emby.Server/project.json125
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"
+ }
+ }
+ }
+ }
+}