📄 src/Api/Program.cs
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Quartz;
using Quartz.AspNetCore;
using Slopper.Api;
using Slopper.Api.YouTubeAuth;
using Slopper.Domain;
using Slopper.Infrastructure.Ai;
using Slopper.Infrastructure.Database;
using Slopper.Infrastructure.Ffmpeg;
using Slopper.Infrastructure.YouTube;
using Winton.Extensions.Configuration.Consul;

var builder = WebApplication.CreateBuilder(args);

if (!builder.Environment.IsDevelopment())
{
    builder.Configuration.AddConsul(
        "slopper",
        options =>
        {
            options.ConsulConfigurationOptions = options =>
                options.Address = new(builder.Configuration["Consul:Address"]!);
            options.ReloadOnChange = true;
        }
    );
}

builder.ConfigureOpenTelemetry();

builder.Services.AddOpenApi();

builder.Services.AddClipSelector().AddClipGenerator().AddCleaner().AddUploader();

builder.Services.AddJellyfinDatabase().AddSlopperDatabase().AddFfmpegServices().AddAi().AddYouTubeUploader();

builder
    .Services.AddClipGenerationJobOptions()
    .AddQuartz(quartz =>
        quartz.AddClipGenerationJob(startNow: !builder.Environment.IsDevelopment()).AddCleanupJob().AddUploadJob()
    )
    .AddQuartzServer();

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie().AddYouTube();

builder.Services.AddAuthorizationBuilder().AddYouTubePolicy();

if (builder.Environment.IsDevelopment())
{
    builder.Services.Configure<CookiePolicyOptions>(options => options.MinimumSameSitePolicy = SameSiteMode.Lax);
}

using var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();

app.MapOpenApi();

app.MapApi();

app.UseDefaultFiles();
app.UseStaticFiles();

app.MapFallbackToFile("index.html");

app.Run();