Directory.Packages.props
+19
-5
diff --git a/Directory.Packages.props b/Directory.Packages.props
index eabda70..fa541e8 100644
@@ -10,6 +10,7 @@
</GlobalPackageReference>
<PackageVersion Include="FFMpegCore" Version="5.4.0" />
<PackageVersion Include="Jellyfin.Database.Implementations" Version="10.11.8" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="11.0.0-preview.3.26207.106" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.7">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
@@ -18,18 +19,31 @@
<PackageVersion Include="Microsoft.Extensions.AI" Version="10.5.2" />
<PackageVersion Include="Microsoft.Extensions.AI.Abstractions" Version="10.5.2" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="11.0.0-preview.3.26207.106" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="11.0.0-preview.3.26207.106" />
<PackageVersion
Include="Microsoft.Extensions.Hosting.Abstractions"
Version="11.0.0-preview.3.26207.106"
/>
<PackageVersion Include="Microsoft.Extensions.Http" Version="11.0.0-preview.3.26207.106" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="11.0.0-preview.3.26207.106" />
<PackageVersion
Include="Microsoft.Extensions.Logging.Abstractions"
Version="11.0.0-preview.3.26207.106"
/>
<PackageVersion Include="Microsoft.Extensions.Options" Version="11.0.0-preview.3.26207.106" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="11.0.0-preview.3.26207.106" />
<PackageVersion
Include="Microsoft.Extensions.Options.ConfigurationExtensions"
Version="11.0.0-preview.3.26207.106"
/>
<PackageVersion Include="OllamaSharp" Version="5.4.25" />
<PackageVersion Include="OpenTelemetry" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.15.1-beta.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.15.2" />
<PackageVersion
Include="OpenTelemetry.Instrumentation.EntityFrameworkCore"
Version="1.15.1-beta.1"
/>
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.15.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.15.1" />
<PackageVersion Include="SubtitlesParserV2" Version="2.4.0" />
</ItemGroup>
</Project>
\ No newline at end of file
</Project>
Slopper.slnx
+1
-0
diff --git a/Slopper.slnx b/Slopper.slnx
index 3cdf698..1fde094 100644
@@ -1,5 +1,6 @@
<Solution>
<Folder Name="/src/">
<Project Path="src/Api/Api.csproj" />
<Project Path="src/Cli/Cli.csproj" />
<Project Path="src/Domain/Domain.csproj" />
</Folder>
src/Api/Api.csproj
+22
-0
diff --git a/src/Api/Api.csproj b/src/Api/Api.csproj
new file mode 100644
index 0000000..8e6ab2e
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<RootNamespace>Slopper.Api</RootNamespace>
<AssemblyName>Slopper.Api</AssemblyName>
<UserSecretsId>ad38b97a-09e9-4354-9c4f-710bf6b7a3ac</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Domain\Domain.csproj" />
<ProjectReference Include="..\Infrastructure\Ai\Ai.csproj" />
<ProjectReference Include="..\Infrastructure\Database\Database.csproj" />
<ProjectReference Include="..\Infrastructure\Ffmpeg\Ffmpeg.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
</ItemGroup>
</Project>
src/Api/ApiEndpoints.cs
+61
-0
diff --git a/src/Api/ApiEndpoints.cs b/src/Api/ApiEndpoints.cs
new file mode 100644
index 0000000..e9fe4af
@@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
using Slopper.Domain;
namespace Slopper.Api;
public static class ApiEndpoints
{
extension(IEndpointRouteBuilder endpoints)
{
public IEndpointConventionBuilder MapApi()
{
var api = endpoints.MapGroup("/api");
var clips = api.MapGroup("/clips");
clips.MapGet("/", GetClips).WithDisplayName("Get Latest Clips");
clips
.MapGet("/{id}/stream", GetClipStream)
.WithDisplayName("Get Video Stream for Clip")
.Produces(StatusCodes.Status200OK, contentType: "video/mp4")
.Produces(StatusCodes.Status404NotFound);
return api;
}
}
private static IAsyncEnumerable<Clip> GetClips(
[FromServices] IClipRepository clipRepository,
CancellationToken cancellationToken,
[FromQuery] Guid? after = null,
[FromQuery, Range(0, 64)] int limit = 10
) => clipRepository.GetLatest(after, limit, cancellationToken).Select(Clip.FromDomain);
private static async Task<IResult> GetClipStream(
[FromServices] IClipRepository clipRepository,
[FromRoute] Guid id,
CancellationToken cancellationToken
)
{
var clip = await clipRepository.Get(id, cancellationToken);
if (clip is null)
{
return Results.NotFound();
}
return Results.File(
clip.Path,
contentType: "video/mp4",
fileDownloadName: $"{clip.Id}.mp4",
lastModified: clip.CreatedAt,
enableRangeProcessing: true
);
}
}
src/Api/Clip.cs
+8
-0
diff --git a/src/Api/Clip.cs b/src/Api/Clip.cs
new file mode 100644
index 0000000..b53c96f
@@ -0,0 +1,8 @@
using System;
namespace Slopper.Api;
public sealed record Clip(Guid Id, TimeSpan Duration, DateTimeOffset CreatedAt)
{
public static Clip FromDomain(Domain.Clip clip) => new(clip.Id, clip.Duration, clip.CreatedAt);
}
src/Api/OpenTelemetryExtensions.cs
+56
-0
diff --git a/src/Api/OpenTelemetryExtensions.cs b/src/Api/OpenTelemetryExtensions.cs
new file mode 100644
index 0000000..ab043c8
@@ -0,0 +1,56 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
using Slopper.Infrastructure.Ffmpeg;
namespace Slopper.Api;
public static class OpenTelemetryExtensions
{
extension<TBuilder>(TBuilder builder)
where TBuilder : IHostApplicationBuilder
{
public TBuilder ConfigureOpenTelemetry()
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder
.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddHttpClientInstrumentation().AddRuntimeInstrumentation();
})
.WithTracing(tracing =>
{
tracing
.AddSource(builder.Environment.ApplicationName)
.AddHttpClientInstrumentation()
.AddEntityFrameworkCoreInstrumentation()
.AddFfmpegInstrumentation();
});
builder.AddOpenTelemetryExporters();
return builder;
}
private TBuilder AddOpenTelemetryExporters()
{
var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
if (useOtlpExporter)
{
builder.Services.AddOpenTelemetry().UseOtlpExporter();
}
return builder;
}
}
}
src/Api/Program.cs
+25
-0
diff --git a/src/Api/Program.cs b/src/Api/Program.cs
new file mode 100644
index 0000000..f48c423
@@ -0,0 +1,25 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Slopper.Api;
using Slopper.Domain;
using Slopper.Infrastructure.Ai;
using Slopper.Infrastructure.Database;
using Slopper.Infrastructure.Ffmpeg;
var builder = WebApplication.CreateBuilder(args);
builder.ConfigureOpenTelemetry();
builder.Services.AddOpenApi();
builder.Services.AddClipSelector().AddClipGenerator();
builder.Services.AddJellyfinDatabase().AddSlopperDatabase().AddFfmpegServices().AddAi();
using var app = builder.Build();
app.MapOpenApi();
app.MapApi();
app.Run();
src/Api/Properties/launchSettings.json
+14
-0
diff --git a/src/Api/Properties/launchSettings.json b/src/Api/Properties/launchSettings.json
new file mode 100644
index 0000000..91f0d3a
@@ -0,0 +1,14 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "http://localhost:5055",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
src/Api/appsettings.Development.json
+33
-0
diff --git a/src/Api/appsettings.Development.json b/src/Api/appsettings.Development.json
new file mode 100644
index 0000000..dd84c47
@@ -0,0 +1,33 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Slopper": "Debug"
}
},
"ClipSelector": {
"ClippableQuotes": [
"I'll be back",
"May the Force be with you",
"You shall not pass!",
"Why so serious?",
"I'm king of the world!",
"Houston, we have a problem",
"You can't handle the truth!",
"Here's looking at you, kid",
"Go ahead, make my day",
"I see dead people",
"Life is like a box of chocolates",
"You had me at hello",
"Show me the money!",
"I feel the need... the need for speed",
"Carpe diem. Seize the day, boys",
"Keep your friends close, but your enemies closer",
"Say hello to my little friend!",
"What we've got here is failure to communicate",
"Love means never having to say you're sorry",
"There's no place like home"
]
}
}
src/Api/appsettings.json
+9
-0
diff --git a/src/Api/appsettings.json b/src/Api/appsettings.json
new file mode 100644
index 0000000..10f68b8
@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
src/Api/packages.lock.json
+680
-0
diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json
new file mode 100644
index 0000000..7124b79
@@ -0,0 +1,680 @@
{
"version": 2,
"dependencies": {
"net11.0": {
"CSharpier.MsBuild": {
"type": "Direct",
"requested": "[1.2.6, )",
"resolved": "1.2.6",
"contentHash": "KMSJG+jfk7vjP52QkWB99qWespXCPAzG/IaMCMRHYWumJEAGKQYm2HtyWG6eqnOwDitH96i1cqq5EVesyOtPmg=="
},
"Microsoft.AspNetCore.OpenApi": {
"type": "Direct",
"requested": "[11.0.0-preview.3.26207.106, )",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "Gebg+J/FI9ImcWSg/dz9CAlOgb1eRjIApCo4WufN855DtT52X5rP7GwDW9w1xFhy8t0LFC9TdhnjmKY/W5PaNA==",
"dependencies": {
"Microsoft.Extensions.Hosting": "11.0.0-preview.3.26207.106",
"Microsoft.OpenApi": "3.3.1"
}
},
"OpenTelemetry.Exporter.OpenTelemetryProtocol": {
"type": "Direct",
"requested": "[1.15.3, )",
"resolved": "1.15.3",
"contentHash": "FEXJepcseTGbATiCkUfP7ipoFEYYfl/0UmmUwi0KxCPg9PaUA8ab2P1LGopK+/HExasJ1ZutFhZrN6WvUIR23g==",
"dependencies": {
"OpenTelemetry": "1.15.3"
}
},
"OpenTelemetry.Extensions.Hosting": {
"type": "Direct",
"requested": "[1.15.3, )",
"resolved": "1.15.3",
"contentHash": "u8n/W8yIlqv0BXZmvId1iVaeWXG42tGKdTkuLYg5g57Y/r9CeUNzqtrSHNdG5IoO8iPX79w3v+WsbAHgUQbfeg==",
"dependencies": {
"OpenTelemetry": "1.15.3"
}
},
"OpenTelemetry.Instrumentation.AspNetCore": {
"type": "Direct",
"requested": "[1.15.2, )",
"resolved": "1.15.2",
"contentHash": "2nPd7r0ug/gd6/CNFL6Rlu+RSQ9WYGSGHAYQ1ssbSqyzKJpqTunfx2I/1O0WB5k+L0cyXbG4XVZpoSoUc3M7wg==",
"dependencies": {
"OpenTelemetry.Api.ProviderBuilderExtensions": "[1.15.3, 2.0.0)"
}
},
"OpenTelemetry.Instrumentation.EntityFrameworkCore": {
"type": "Direct",
"requested": "[1.15.1-beta.1, )",
"resolved": "1.15.1-beta.1",
"contentHash": "NmtYLk3HJUUkV0g2VnFLs67/PGIVbI8JXtu0g4f9bk2ZaInp211/AL2+Qcbgkb9ih/uOi8loN6E1Aw2o0YIWag==",
"dependencies": {
"OpenTelemetry.Api.ProviderBuilderExtensions": "[1.15.3, 2.0.0)"
}
},
"OpenTelemetry.Instrumentation.Http": {
"type": "Direct",
"requested": "[1.15.1, )",
"resolved": "1.15.1",
"contentHash": "vFO4Fj/dXkoVNGo/nhoGpO2zYQmZwr4jTID7oRGo+XlQ8LqksyZjUXQ4p39RfUvTID7IzzL8Qe71tW7CcAFymA==",
"dependencies": {
"OpenTelemetry.Api.ProviderBuilderExtensions": "[1.15.3, 2.0.0)"
}
},
"OpenTelemetry.Instrumentation.Runtime": {
"type": "Direct",
"requested": "[1.15.1, )",
"resolved": "1.15.1",
"contentHash": "cpPwlUT5HXcLGPaIgsbSy0W9eFYAPGVbTP1p8/uyQ4Osvf5BJuPpEXE7crL09SmEd44r0DGNKDtsqxaAz0HxQw==",
"dependencies": {
"OpenTelemetry.Api": "[1.15.3, 2.0.0)"
}
},
"Instances": {
"type": "Transitive",
"resolved": "3.0.2",
"contentHash": "LfhegDpmA8PuHW58RmgVvCDG/mfVCTU+Vhy4ppmXLJfAer33Xl0NocDy92OwSL6CnkVdx41O/I0+BjNhU1JtMQ=="
},
"Microsoft.Data.Sqlite.Core": {
"type": "Transitive",
"resolved": "10.0.7",
"contentHash": "xVrtBg3M1wJlBDkoT0dXEYB/wSc8bIHJPYtw/bu1AqpWgF79uPSs87DAhERR/Ilumre6TKZa1cjMg3VUUObVLA==",
"dependencies": {
"SQLitePCLRaw.core": "2.1.11"
}
},
"Microsoft.EntityFrameworkCore": {
"type": "Transitive",
"resolved": "10.0.7",
"contentHash": "G6yclVO5/csPzzsymV0SemY2NDqE31CP5M3jprF5IuO9wJsh4aUOfYD8HCLuDmM1D1CfReegVic48O2r79d46Q==",
"dependencies": {
"Microsoft.EntityFrameworkCore.Abstractions": "10.0.7",
"Microsoft.EntityFrameworkCore.Analyzers": "10.0.7"
}
},
"Microsoft.EntityFrameworkCore.Abstractions": {
"type": "Transitive",
"resolved": "10.0.7",
"contentHash": "TuxExnfIS/bSq3z2CbH0LwZH1oyj9iHhSGneU4fpxl3ikjZGZdSae9gcfnImV1rufH8f/ab1NnHwyL2BLyeZOg=="
},
"Microsoft.EntityFrameworkCore.Analyzers": {
"type": "Transitive",
"resolved": "10.0.7",
"contentHash": "eZnMyiJzo249Ejg5CaFScvJS0u7neQfS9DXknAHTO6FHVMM99gO0byNXHGZmA/BOkZ13ngeVziQLHTMOtgescg=="
},
"Microsoft.EntityFrameworkCore.Relational": {
"type": "Transitive",
"resolved": "10.0.7",
"contentHash": "midwPufIwXhOJcVhaZpCZGNbjy2QoPfHI+70nw2dGcoULEW9DybMvMPYkRjOJV0eI46a1oVFhU4lFYDEx6YUbg==",
"dependencies": {
"Microsoft.EntityFrameworkCore": "10.0.7"
}
},
"Microsoft.EntityFrameworkCore.Sqlite.Core": {
"type": "Transitive",
"resolved": "10.0.7",
"contentHash": "XVjGSW98Z/f3nFZsZILL/tntgM8i2hxUDUB4Nzt7ZvJ63MczC/VG4zjQh+m+q88SU+IJBUDipJJpkYBU57YWXg==",
"dependencies": {
"Microsoft.Data.Sqlite.Core": "10.0.7",
"Microsoft.EntityFrameworkCore.Relational": "10.0.7",
"Microsoft.Extensions.DependencyModel": "10.0.7",
"SQLitePCLRaw.core": "2.1.11"
}
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "Do6yieeVHdvwyIKED9oPfFHAH5PAkvwDjR+65u2ZS/ddSHvEtOd5e5rrAQyhIIflbCz13graO/XkBQQV5EJNkg==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Primitives": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "DAFozg1P/fA2yh36sYLS/NMDxGCFATUFNYbgQi1wbkFT2cFYqEsK/VYbTXsiXKQfr3G/d4Rnorpe0In2WBaMIA==",
"dependencies": {
"Microsoft.Extensions.Primitives": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "ulM+V32IqcFYIqIxxT7MZjSfpQ9T3k33chyBrnjcfSm1BQFIgtdTcXAlZJpzZmFAklh4PHG7BFuVw9PIJ1KcUg==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Configuration.CommandLine": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "U6sEg+C6dPDmBAbL45ydyq25W2Hd6te3WU80q7Ju6eS3u0t/+mLlaE4a8lM4HXgHX8AP4XYxFCCvczEuiMebGQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Configuration.EnvironmentVariables": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "I3Lr1qTHlFF2ZoLJBSvjDW8V9xU8PBmh8hHzYbR4c+WkURNakNm90NwYhbyXUca9fjDxBL5hH+O9bKFrtW6w8Q==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Configuration.FileExtensions": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "kzvWh5HYC9EZd/sXSq6Ips3LpznkqXRGmDJI9XdpMJLqliD6PC6ffp6OVMaQ64z7PrljtE9bZTMrVG+2VCsCEw==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.FileProviders.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.FileProviders.Physical": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Primitives": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Configuration.Json": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "d6msKM6uFvcr4mAVWMlQvZVwhGs1kauyeMVEY7qzd1MVSNvE/A6MXiUjnXEBgzULO9H7P2KNd6KTB6XIbkc3Mg==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.FileExtensions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.FileProviders.Abstractions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Configuration.UserSecrets": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "xoZsZZWpasMms6vYo7XpxrUJQZkKor4Ai3T8nsCvbtzBI6RcQr/e/y1QUjQq2vaT7oaWiTgSxCs4vtrWUrjdBQ==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Json": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.FileProviders.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.FileProviders.Physical": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "aq5Lc0SLQiJGRauG829dTpoMygFLpuelBspnnNi4rRKa8C8eqruxdrCIzJ0po2NQlpgoNprHlC0vQsT0fDxH4w==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "+gJnv1/kfXLXPv21R3iluhKqfXdf2zPWUaHBiSvlJurThv2D5HRUfU5z5SpmBII4I0JSpuprX9DlHrKz/1wCXA=="
},
"Microsoft.Extensions.DependencyModel": {
"type": "Transitive",
"resolved": "10.0.7",
"contentHash": "gCglFg/9Chu3lyJNytRuQAYM3mXQKNs1i01Cz2bc545QaHQ+LbBb4O5UCfu968Gro3ZVSOZ/ktilmPcaUSGSZA=="
},
"Microsoft.Extensions.Diagnostics": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "Gv4wwBodQj50cbyfXvoHRue1sEA4hVSwBv2bR0Oi8Re/cxvxyfrBKWJg5KYANDQW242uohhzDSOmyx0kY8wNLw==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Diagnostics.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options.ConfigurationExtensions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Diagnostics.Abstractions": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "Jw8scnPDYKkBJE3LSvAQQ/P4OBypQclFuFqcYo3RLGt5zr9EhC1V0ozwxr8/xe/66IHfPA9YhdhYegAn4Y7t5Q==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.FileProviders.Abstractions": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "gFkzHF108G5VcXP2vByvxTEi3ixKn9K5Br+qOXYu+Ezyk6SDOLyl9jryVyEhwcAERzb6/ba3ZEE2gdPcQBbhgA==",
"dependencies": {
"Microsoft.Extensions.Primitives": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.FileProviders.Physical": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "FS9xmt0Tw94kEwPMhE3XEmwVx4HMIcgPvvCdWAfiqrEtL6wPNlrLEWxn8JDbp+rRl2MvXUuGJsU6Zt9DFtH+Fg==",
"dependencies": {
"Microsoft.Extensions.FileProviders.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.FileSystemGlobbing": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Primitives": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.FileSystemGlobbing": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "gI8O5FzTgw9yKbYKvGxDdymIackACfG+VF5cAisZExZcZ3/BaZ1YBN7jsURoiHUmaN8KTNwCqjxWhITHFq18Cw=="
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "nyfgC4LADfHGoen9Hmuc1iwj047w9Vm+f+ARGJL8spYqdOBDQIhnsSA2FpkY3w3yoZu2hzOmluB7ML0NigxHbw==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "riLRenN4/k/n2IImBcxtL2BYbyu8WYgLv/T/NjtZsbOzTS8Qe3m+VjLc8OsbdMvRKSQLGQipC35KmbNNdemrmw==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options.ConfigurationExtensions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Logging.Console": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "JXs47g8XbOSvys8RPcmClmQtzjBzG45kR8Te6Fcr9c3rOEBMhNas8zrBhXXLiQ6nFiBOdOO0dylKgu5TfMP9kw==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Logging.Debug": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "hFHQlT3NH/+Sb/V35wNlZnZcRNIa7HNJ1RTakjjFWl/ialDPtKFKVc+oQ6llIo2WMwz/9oX2V0IZcnkzm9qGjA==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Abstractions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Logging.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "Y2/NC/RHH1OUxRegXLtSFcqtWxcXVI5fXcq+ClDBczv6tALWkthqpyBkWM/21axlSt8uEkgqsj+SS0R9R6oSCg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options": "11.0.0-preview.3.26207.106",
"System.Diagnostics.EventLog": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Logging.EventSource": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "6pFefU2XErE56mLKHpPc7dPeIGjhUaSJb87wkTT3fKzcWXLofv/V0SFGuF4vJDpV2UVZz/7APD7fqOeaGIP0fQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Primitives": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "IBOlwyX13ax6/fXA7AoZFswKFytta9TExBv3/8qemMJGBoDXYlQEcw4WerHQCvmerJ5uP2o8bjIAvxcNdTZVLQ=="
},
"Microsoft.OpenApi": {
"type": "Transitive",
"resolved": "3.3.1",
"contentHash": "8Xo42prPRLeQpcSv9sjajQQ0o+gL7rZ4HMUsNNI47iqK+bxDrIwLOGlN9fLAlTpJk0iyXRNR51zupMt5IdhU/w=="
},
"OpenTelemetry.Api": {
"type": "Transitive",
"resolved": "1.15.3",
"contentHash": "fX+fkCysfPut+qCcT3bKqyX4QN9Saf4CgX8HLOHywEVD+Xr7sULtfuypITpoDysjx8R59dn/3mWhgimMH8cm/g=="
},
"OpenTelemetry.Api.ProviderBuilderExtensions": {
"type": "Transitive",
"resolved": "1.15.3",
"contentHash": "SYn0lqYDwLMWhv/zlNGsQcl2yX++yTumanX46bmOZE/ZDOd1WjPBO2kZaZgKLEZTZk48pavIFGJ6vOvxXgWVFQ==",
"dependencies": {
"OpenTelemetry.Api": "1.15.3"
}
},
"Polly": {
"type": "Transitive",
"resolved": "8.6.5",
"contentHash": "VqtW2ZE/ALvQMAH1cQY3qZ2cF2OXa3oe/HKMdOv6Q02HCoEW0rsFNfcBONXlHBe1TnjWW1vdRxBEkPeq0/2FHA==",
"dependencies": {
"Polly.Core": "8.6.5"
}
},
"Polly.Core": {
"type": "Transitive",
"resolved": "8.6.5",
"contentHash": "t+sUVrIwvo7UmsgHGgOG9F0GDZSRIm47u2ylH17Gvcv1q5hNEwgD5GoBlFyc0kh/pebmPyrAgvGsR/65ZBaXlg=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "DC4nA7yWnf4UZdgJDF+9Mus4/cb0Y3Sfgi3gDnAoKNAIBwzkskNAbNbyu+u4atT0ruVlZNJfwZmwiEwE5oz9LQ==",
"dependencies": {
"SQLitePCLRaw.lib.e_sqlite3": "2.1.11",
"SQLitePCLRaw.provider.e_sqlite3": "2.1.11"
}
},
"SQLitePCLRaw.core": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "PK0GLFkfhZzLQeR3PJf71FmhtHox+U3vcY6ZtswoMjrefkB9k6ErNJEnwXqc5KgXDSjige2XXrezqS39gkpQKA=="
},
"SQLitePCLRaw.lib.e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "Ev2ytaXiOlWZ4b3R67GZBsemTINslLD1DCJr2xiacpn4tbapu0Q4dHEzSvZSMnVWeE5nlObU3VZN2p81q3XOYQ=="
},
"SQLitePCLRaw.provider.e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "Y/0ZkR+r0Cg3DQFuCl1RBnv/tmxpIZRU3HUvelPw6MVaKHwYYR8YNvgs0vuNuXCMvlyJ+Fh88U1D4tah1tt6qw==",
"dependencies": {
"SQLitePCLRaw.core": "2.1.11"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "dcvsAEx7YxeuSfzj5QOx8B1npA+3WuI25nLb9IscNyvgGB1cDmliDE9WRlwJvGaHhCBjqQO0G4dyB+3V7BLFzA=="
},
"System.Numerics.Tensors": {
"type": "Transitive",
"resolved": "10.0.6",
"contentHash": "DOZ8Z8CxHVWU8gSo4ZQ8sCAPIQb+agp56ISuMiu39WWZiV+reZwn9NM1tj4lRDfqLaOAinF6zTi0csmFBQes9Q=="
},
"Slopper.Domain": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.AI.Abstractions": "[10.5.2, )",
"Microsoft.Extensions.Logging.Abstractions": "[11.0.0-preview.3.26207.106, )",
"Microsoft.Extensions.Options": "[11.0.0-preview.3.26207.106, )",
"Microsoft.Extensions.Options.ConfigurationExtensions": "[11.0.0-preview.3.26207.106, )"
}
},
"Slopper.Infrastructure.Ai": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.AI": "[10.5.2, )",
"Microsoft.Extensions.Http": "[11.0.0-preview.3.26207.106, )",
"OllamaSharp": "[5.4.25, )",
"Slopper.Domain": "[1.0.0, )"
}
},
"Slopper.Infrastructure.Database": {
"type": "Project",
"dependencies": {
"Jellyfin.Database.Implementations": "[10.11.8, )",
"Microsoft.EntityFrameworkCore.Sqlite": "[10.0.7, )",
"Microsoft.Extensions.Hosting.Abstractions": "[11.0.0-preview.3.26207.106, )",
"Slopper.Domain": "[1.0.0, )"
}
},
"Slopper.Infrastructure.Ffmpeg": {
"type": "Project",
"dependencies": {
"FFMpegCore": "[5.4.0, )",
"Microsoft.Extensions.Logging.Abstractions": "[11.0.0-preview.3.26207.106, )",
"OpenTelemetry": "[1.15.3, )",
"Slopper.Domain": "[1.0.0, )",
"SubtitlesParserV2": "[2.4.0, )"
}
},
"FFMpegCore": {
"type": "CentralTransitive",
"requested": "[5.4.0, )",
"resolved": "5.4.0",
"contentHash": "nymhPWpwvBaB4fOqf0thxg7Inm8SrruFQLdCMFEDKD8S3hy0/iV2vuKaJvaL9ZnbJx/2rJCHnJXOymo2apXovg==",
"dependencies": {
"Instances": "3.0.2"
}
},
"Jellyfin.Database.Implementations": {
"type": "CentralTransitive",
"requested": "[10.11.8, )",
"resolved": "10.11.8",
"contentHash": "v8f/O0CQkjzGLZaKnwkUkh1p4SqEnZqWZHBAhU5rc+NgQLF9jKtWOA2wwTIhTEmm2pKGJz2wVcICfH8Q7Ao8aw==",
"dependencies": {
"Microsoft.EntityFrameworkCore.Relational": "9.0.11",
"Polly": "8.6.5"
}
},
"Microsoft.EntityFrameworkCore.Sqlite": {
"type": "CentralTransitive",
"requested": "[10.0.7, )",
"resolved": "10.0.7",
"contentHash": "0cnk9Chkuz2Jc6pbXRqdjy2CMAi62q4dJhvJzG25iCIvbavUYLxk/5ukwM+mzOl7ADN88WPmY1Lx1cAH2g8QSA==",
"dependencies": {
"Microsoft.EntityFrameworkCore.Sqlite.Core": "10.0.7",
"Microsoft.Extensions.DependencyModel": "10.0.7",
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.11",
"SQLitePCLRaw.core": "2.1.11"
}
},
"Microsoft.Extensions.AI": {
"type": "CentralTransitive",
"requested": "[10.5.2, )",
"resolved": "10.5.2",
"contentHash": "nmhzep22lJmDvv15wDlM+bwhr3o4G+hTTrIL9veNmXqtsJdpNkh2JAz1UMy72AqVPuysSDMLajuOLsLqSuyH4A==",
"dependencies": {
"Microsoft.Extensions.AI.Abstractions": "10.5.2",
"System.Numerics.Tensors": "10.0.6"
}
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
"requested": "[10.5.2, )",
"resolved": "10.5.2",
"contentHash": "Ei+YWV9Ybnps7pR1dgjlG29gelXEwZkhLVAcWmKe6HvXS6LNBYgSdWiY3Hk9OZXYtK34rv/NtLWBQYQGOBQYPQ=="
},
"Microsoft.Extensions.Hosting": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.3.26207.106, )",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "OAk9kLwMWqCIDXCirlGDI7Ni8YOcHjN1Ksr8LVDZUszQbdvxw/CNBPbhsZWlCvHMG/7+L6yTcciFRQSU52bBlA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.CommandLine": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.FileExtensions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Json": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.UserSecrets": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.DependencyInjection": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Diagnostics": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.FileProviders.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.FileProviders.Physical": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Hosting.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Configuration": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Console": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Debug": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.EventLog": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.EventSource": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Hosting.Abstractions": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.3.26207.106, )",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "iPci8e1kji1I1htDLS73y7+AnYIEneWzswjcijaR1Yl/Gc7HAEdx9SZTpt77T8TB9c9ejHiMazzIjlnXm4G18A==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Diagnostics.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.FileProviders.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Abstractions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Http": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.3.26207.106, )",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "CsZ7uQ32bwS0MlElEsz5OrBKn3CGd5raaG+oY4BMfs7e7c+2sjFXmBMgPp5ttCXAciD6spVP++Ol2OzViNsuVw==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Diagnostics": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Logging.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.3.26207.106, )",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "0LktkD4eySHjlglnee7jt/I3KPea+MPIxLTYBacH1P/iluOCl7VVKwpG/bciZMkyaNnfslY2E70t6nfvjq51vA==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Options": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.3.26207.106, )",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "2kd+Lqnh8bvBun9wH+MUZ15Pb+4LAY0ErmeBhy5bsliLQyjRsoejWEOgyjkiZpLj9iLNM8tYAt6SW2vkzFbR8g==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Primitives": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.3.26207.106, )",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "DbZcRfBrCSLas0cS0iKdiez9kM/7Z3rz5xlDJKqAxhGPGzhKJu82Z3+LNANPZSTUbyYnNawb3Euvv8ACPPatjQ==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Options": "11.0.0-preview.3.26207.106",
"Microsoft.Extensions.Primitives": "11.0.0-preview.3.26207.106"
}
},
"OllamaSharp": {
"type": "CentralTransitive",
"requested": "[5.4.25, )",
"resolved": "5.4.25",
"contentHash": "EqkPM1gbkE+RbHgKUMzp4lYjpFymWUIgJntx3u4uDXAfAIFUXJ0MGklNFCi/PdCaxNAPRpcf205yx+g6jLLhZg==",
"dependencies": {
"Microsoft.Extensions.AI.Abstractions": "10.4.1"
}
},
"OpenTelemetry": {
"type": "CentralTransitive",
"requested": "[1.15.3, )",
"resolved": "1.15.3",
"contentHash": "N0i6WjPoHPbZyms1ugbDIFAJFuGlpeExJMU/+XSL0lQRUkg/D0utFkDoLXf8Z1km5B+xVZ2GyMXXiX8qdeNmPg==",
"dependencies": {
"OpenTelemetry.Api.ProviderBuilderExtensions": "1.15.3"
}
},
"SubtitlesParserV2": {
"type": "CentralTransitive",
"requested": "[2.4.0, )",
"resolved": "2.4.0",
"contentHash": "/QDneMSeMa1SxLu8IDsaX6WFFDdUqxn7GVI654NGgK/X4nGqKLmlrMi2CUFROD1nphp7EURrlIPIsAgSRtEgcg=="
}
},
"net11.0/linux-arm64": {
"SQLitePCLRaw.lib.e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "Ev2ytaXiOlWZ4b3R67GZBsemTINslLD1DCJr2xiacpn4tbapu0Q4dHEzSvZSMnVWeE5nlObU3VZN2p81q3XOYQ=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "dcvsAEx7YxeuSfzj5QOx8B1npA+3WuI25nLb9IscNyvgGB1cDmliDE9WRlwJvGaHhCBjqQO0G4dyB+3V7BLFzA=="
}
},
"net11.0/linux-x64": {
"SQLitePCLRaw.lib.e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "Ev2ytaXiOlWZ4b3R67GZBsemTINslLD1DCJr2xiacpn4tbapu0Q4dHEzSvZSMnVWeE5nlObU3VZN2p81q3XOYQ=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "dcvsAEx7YxeuSfzj5QOx8B1npA+3WuI25nLb9IscNyvgGB1cDmliDE9WRlwJvGaHhCBjqQO0G4dyB+3V7BLFzA=="
}
},
"net11.0/osx-arm64": {
"SQLitePCLRaw.lib.e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "Ev2ytaXiOlWZ4b3R67GZBsemTINslLD1DCJr2xiacpn4tbapu0Q4dHEzSvZSMnVWeE5nlObU3VZN2p81q3XOYQ=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "dcvsAEx7YxeuSfzj5QOx8B1npA+3WuI25nLb9IscNyvgGB1cDmliDE9WRlwJvGaHhCBjqQO0G4dyB+3V7BLFzA=="
}
},
"net11.0/osx-x64": {
"SQLitePCLRaw.lib.e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "Ev2ytaXiOlWZ4b3R67GZBsemTINslLD1DCJr2xiacpn4tbapu0Q4dHEzSvZSMnVWeE5nlObU3VZN2p81q3XOYQ=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "dcvsAEx7YxeuSfzj5QOx8B1npA+3WuI25nLb9IscNyvgGB1cDmliDE9WRlwJvGaHhCBjqQO0G4dyB+3V7BLFzA=="
}
},
"net11.0/win-arm64": {
"SQLitePCLRaw.lib.e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "Ev2ytaXiOlWZ4b3R67GZBsemTINslLD1DCJr2xiacpn4tbapu0Q4dHEzSvZSMnVWeE5nlObU3VZN2p81q3XOYQ=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "dcvsAEx7YxeuSfzj5QOx8B1npA+3WuI25nLb9IscNyvgGB1cDmliDE9WRlwJvGaHhCBjqQO0G4dyB+3V7BLFzA=="
}
},
"net11.0/win-x64": {
"SQLitePCLRaw.lib.e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
"contentHash": "Ev2ytaXiOlWZ4b3R67GZBsemTINslLD1DCJr2xiacpn4tbapu0Q4dHEzSvZSMnVWeE5nlObU3VZN2p81q3XOYQ=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "dcvsAEx7YxeuSfzj5QOx8B1npA+3WuI25nLb9IscNyvgGB1cDmliDE9WRlwJvGaHhCBjqQO0G4dyB+3V7BLFzA=="
}
}
}
}
\ No newline at end of file
src/Domain/IClipRepository.cs
+2
-0
diff --git a/src/Domain/IClipRepository.cs b/src/Domain/IClipRepository.cs
index f3f4e55..5f0b6aa 100644
@@ -9,5 +9,7 @@ public interface IClipRepository
{
IAsyncEnumerable<Clip> GetLatest(Guid? after = null, int limit = 10, CancellationToken cancellationToken = default);
Task<Clip?> Get(Guid id, CancellationToken cancellationToken);
Task Save(Clip clip, CancellationToken cancellationToken);
}
src/Infrastructure/Database/Slopper/ClipRepository.cs
+3
-0
diff --git a/src/Infrastructure/Database/Slopper/ClipRepository.cs b/src/Infrastructure/Database/Slopper/ClipRepository.cs
index 6c57d4f..2d06b99 100644
@@ -20,6 +20,9 @@ internal sealed class ClipRepository(SlopperDbContext slopperContext) : IClipRep
return query.Take(limit).AsAsyncEnumerable();
}
public async Task<Clip?> Get(Guid id, CancellationToken cancellationToken) =>
await slopperContext.Clips.AsNoTracking().SingleOrDefaultAsync(c => c.Id == id, cancellationToken);
public async Task Save(Clip clip, CancellationToken cancellationToken)
{
slopperContext.Clips.Add(clip);