using System;
using System.IO;
using System.Threading.Tasks;
using Kyoo.UnityExtensions;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.StaticWebAssets;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Unity;
namespace Kyoo
{
///
/// Program entrypoint.
///
public static class Program
{
///
/// Main function of the program
///
/// Command line arguments
public static async Task Main(string[] args)
{
if (!File.Exists("./settings.json"))
File.Copy(Path.Join(AppDomain.CurrentDomain.BaseDirectory, "settings.json"), "settings.json");
bool? debug = Environment.GetEnvironmentVariable("ENVIRONMENT")?.ToLowerInvariant() switch
{
"d" => true,
"dev" => true,
"debug" => true,
"development" => true,
"p" => false,
"prod" => false,
"production" => false,
_ => null
};
if (debug == null && Environment.GetEnvironmentVariable("ENVIRONMENT") != null)
Console.WriteLine($"Invalid ENVIRONMENT variable. Supported values are \"debug\" and \"prod\". Ignoring...");
#if DEBUG
debug ??= true;
#endif
Console.WriteLine($"Running as {Environment.UserName}.");
IWebHostBuilder builder = CreateWebHostBuilder(args);
if (debug != null)
builder = builder.UseEnvironment(debug == true ? "Development" : "Production");
try
{
await builder.Build().RunAsync();
}
catch (Exception ex)
{
await Console.Error.WriteLineAsync($"Unhandled exception: {ex}");
}
}
///
/// Register settings.json, environment variables and command lines arguments as configuration.
///
/// The configuration builder to use
/// The command line arguments
/// The modified configuration builder
private static IConfigurationBuilder SetupConfig(IConfigurationBuilder builder, string[] args)
{
return builder.AddJsonFile("./settings.json", false, true)
.AddEnvironmentVariables()
.AddCommandLine(args);
}
///
/// Create a a web host
///
/// Command line parameters that can be handled by kestrel
/// A new web host instance
private static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
UnityContainer container = new();
container.EnableDebugDiagnostic();
return new WebHostBuilder()
.UseContentRoot(AppDomain.CurrentDomain.BaseDirectory)
.UseConfiguration(SetupConfig(new ConfigurationBuilder(), args).Build())
.ConfigureAppConfiguration(x => SetupConfig(x, args))
.ConfigureLogging((context, builder) =>
{
builder.AddConfiguration(context.Configuration.GetSection("logging"))
.AddConsole()
.AddDebug()
.AddEventSourceLogger();
})
.UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
if (context.HostingEnvironment.IsDevelopment())
StaticWebAssetsLoader.UseStaticWebAssets(context.HostingEnvironment, context.Configuration);
})
.UseUnityProvider(container)
.ConfigureServices(x => x.AddRouting())
.UseKestrel(options => { options.AddServerHeader = false; })
.UseIIS()
.UseIISIntegration()
.UseStartup();
}
}
}