Directory.Packages.props
+14
-2
diff --git a/Directory.Packages.props b/Directory.Packages.props
index a6a8c0c..227a5cf 100644
@@ -15,8 +15,20 @@
<PrivateAssets>all</PrivateAssets>
</PackageVersion>
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.7" />
<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.Logging.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.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="OllamaSharp" Version="5.4.25" />
<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 cdcc498..3cdf698 100644
@@ -4,6 +4,7 @@
<Project Path="src/Domain/Domain.csproj" />
</Folder>
<Folder Name="/src/Infrastructure/">
<Project Path="src/Infrastructure/Ai/Ai.csproj" />
<Project Path="src/Infrastructure/Database/Database.csproj" />
<Project Path="src/Infrastructure/Ffmpeg/Ffmpeg.csproj" />
</Folder>
packages.lock.json
+121
-0
diff --git a/packages.lock.json b/packages.lock.json
new file mode 100644
index 0000000..9826be9
@@ -0,0 +1,121 @@
{
"version": 2,
"dependencies": {
"net11.0": {
"CSharpier.MsBuild": {
"type": "Direct",
"requested": "[1.2.6, )",
"resolved": "1.2.6",
"contentHash": "KMSJG+jfk7vjP52QkWB99qWespXCPAzG/IaMCMRHYWumJEAGKQYm2HtyWG6eqnOwDitH96i1cqq5EVesyOtPmg=="
},
"Microsoft.DotNet.ILCompiler": {
"type": "Direct",
"requested": "[11.0.0-preview.2.26159.112, )",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "1m9uT/vfd5qkCkScRTf9Njrg4eGqVXJg0mOgasgFQt5xpGIki9AsYqlwry3tKFdoPYk1UqUd1+wq+QZ28AfETQ=="
},
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
"requested": "[11.0.0-preview.2.26159.112, )",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "TnwQtmgvXJ+Moj8F0X41gNiLvXvBjYuWycwC0BUlYM3NHP0jzBAe8jWGuxlPNxh/XGDA7oOcwcpTLGcVJNwOYQ=="
}
},
"net11.0/linux-arm64": {
"Microsoft.DotNet.ILCompiler": {
"type": "Direct",
"requested": "[11.0.0-preview.2.26159.112, )",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "1m9uT/vfd5qkCkScRTf9Njrg4eGqVXJg0mOgasgFQt5xpGIki9AsYqlwry3tKFdoPYk1UqUd1+wq+QZ28AfETQ==",
"dependencies": {
"runtime.linux-arm64.Microsoft.DotNet.ILCompiler": "11.0.0-preview.2.26159.112"
}
},
"runtime.linux-arm64.Microsoft.DotNet.ILCompiler": {
"type": "Transitive",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "aA+wT1AWuoBBfS5z+e3kfDz5c6tt9PGOFw6tu8xFvFUsavBybZhvt/NuJ3548Gl9LssaYKlaVHf/ebMLVeaxEA=="
}
},
"net11.0/linux-x64": {
"Microsoft.DotNet.ILCompiler": {
"type": "Direct",
"requested": "[11.0.0-preview.2.26159.112, )",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "1m9uT/vfd5qkCkScRTf9Njrg4eGqVXJg0mOgasgFQt5xpGIki9AsYqlwry3tKFdoPYk1UqUd1+wq+QZ28AfETQ==",
"dependencies": {
"runtime.linux-x64.Microsoft.DotNet.ILCompiler": "11.0.0-preview.2.26159.112"
}
},
"runtime.linux-x64.Microsoft.DotNet.ILCompiler": {
"type": "Transitive",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "uLIL24Un4IG5inAg56PSOcopXOfamjszv01fm5T3AM62MXoccsj5ig+EhDp5c0ZfkFmd+Qwd5NsaWKijtWgWcA=="
}
},
"net11.0/osx-arm64": {
"Microsoft.DotNet.ILCompiler": {
"type": "Direct",
"requested": "[11.0.0-preview.2.26159.112, )",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "1m9uT/vfd5qkCkScRTf9Njrg4eGqVXJg0mOgasgFQt5xpGIki9AsYqlwry3tKFdoPYk1UqUd1+wq+QZ28AfETQ==",
"dependencies": {
"runtime.osx-arm64.Microsoft.DotNet.ILCompiler": "11.0.0-preview.2.26159.112"
}
},
"runtime.osx-arm64.Microsoft.DotNet.ILCompiler": {
"type": "Transitive",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "7Xejb3hd+RvWpW93OgDCrgaIozZQj+t3E3L9wBWV8KLyapjpKDHXg9gqnLDtRVUDlFba3sHtTO2F8soIeNDkKg=="
}
},
"net11.0/osx-x64": {
"Microsoft.DotNet.ILCompiler": {
"type": "Direct",
"requested": "[11.0.0-preview.2.26159.112, )",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "1m9uT/vfd5qkCkScRTf9Njrg4eGqVXJg0mOgasgFQt5xpGIki9AsYqlwry3tKFdoPYk1UqUd1+wq+QZ28AfETQ==",
"dependencies": {
"runtime.osx-x64.Microsoft.DotNet.ILCompiler": "11.0.0-preview.2.26159.112"
}
},
"runtime.osx-x64.Microsoft.DotNet.ILCompiler": {
"type": "Transitive",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "kcN/8QpduWS0eVVzVrG08Ci5wHUVZQvAR+auhhz/EDLqHoTTAWQ2EUdT+dQkm9cEVt+m6NtiZmWl29SYYSCIqw=="
}
},
"net11.0/win-arm64": {
"Microsoft.DotNet.ILCompiler": {
"type": "Direct",
"requested": "[11.0.0-preview.2.26159.112, )",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "1m9uT/vfd5qkCkScRTf9Njrg4eGqVXJg0mOgasgFQt5xpGIki9AsYqlwry3tKFdoPYk1UqUd1+wq+QZ28AfETQ==",
"dependencies": {
"runtime.win-arm64.Microsoft.DotNet.ILCompiler": "11.0.0-preview.2.26159.112"
}
},
"runtime.win-arm64.Microsoft.DotNet.ILCompiler": {
"type": "Transitive",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "bQukJj0ChOo4/OSXQH7+PhSnlCYPe4496/IkZSJtfhQzeo4s6OWsVxS+9Jh5vim5iHoNHjRbYyM6ldbf+CNywA=="
}
},
"net11.0/win-x64": {
"Microsoft.DotNet.ILCompiler": {
"type": "Direct",
"requested": "[11.0.0-preview.2.26159.112, )",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "1m9uT/vfd5qkCkScRTf9Njrg4eGqVXJg0mOgasgFQt5xpGIki9AsYqlwry3tKFdoPYk1UqUd1+wq+QZ28AfETQ==",
"dependencies": {
"runtime.win-x64.Microsoft.DotNet.ILCompiler": "11.0.0-preview.2.26159.112"
}
},
"runtime.win-x64.Microsoft.DotNet.ILCompiler": {
"type": "Transitive",
"resolved": "11.0.0-preview.2.26159.112",
"contentHash": "aZoDyB4qT2zADZx3DUKfkw49qUISB5x9cwDEgyXUsq4j0VkoI7uzTRLk7KnowighffFTAEs3urJqftBVYHnJdA=="
}
}
}
}
\ No newline at end of file
src/Cli/Cli.csproj
+9
-0
diff --git a/src/Cli/Cli.csproj b/src/Cli/Cli.csproj
index e6ec537..4b9fbde 100644
@@ -6,9 +6,18 @@
<UserSecretsId>9df5410d-6a82-44ba-9e77-7ec4ffcf582a</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<Content Include="appsettings.json" CopyToOutputDirectory="PreserveNewest" />
<Content
Include="appsettings.Development.json"
CopyToOutputDirectory="PreserveNewest"
Condition="'$(Configuration)' == 'Debug'"
/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Domain\Domain.csproj" />
<ProjectReference Include="..\Infrastructure\Database\Database.csproj" />
<ProjectReference Include="..\Infrastructure\Ffmpeg\Ffmpeg.csproj" />
<ProjectReference Include="..\Infrastructure\Ai\Ai.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" />
src/Cli/Program.cs
+15
-10
diff --git a/src/Cli/Program.cs b/src/Cli/Program.cs
index 751ac5a..2c66369 100644
@@ -1,24 +1,29 @@
using System.Reflection;
using System.Threading;
using Microsoft.Extensions.Configuration;
using System.Threading;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Slopper.Domain;
using Slopper.Infrastructure.Ai;
using Slopper.Infrastructure.Database;
using Slopper.Infrastructure.Ffmpeg;
var builder = Host.CreateApplicationBuilder();
builder.Configuration.AddUserSecrets(Assembly.GetExecutingAssembly());
builder.Services.AddClipSelector();
builder.Services.AddJellyfinDatabase().AddFfmpegServices();
builder.Services.AddJellyfinDatabase().AddFfmpegServices().AddAi();
using var app = builder.Build();
var mediaRepository = app.Services.GetRequiredService<IMediaRepository>();
var options = app.Services.GetRequiredService<IOptions<ClipSelectorOptions>>();
var media = await mediaRepository.GetRandomMediaItem(CancellationToken.None);
var media = new MediaItem("test", args[0], new Subtitles.Embedded(0));
var logger = app.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("{Name} ({Path}): {Subs}", media.Name, media.Path, media.Subtitles);
var subtitleReader = app.Services.GetRequiredService<ISubtitleReader>();
var subtitles = await subtitleReader.ReadSubtitles(media, CancellationToken.None);
var clipSelector = app.Services.GetRequiredService<ClipSelector>();
var (start, duration) = await clipSelector.PickClip(subtitles, CancellationToken.None);
var clipExtractor = app.Services.GetRequiredService<ClipExtractor>();
await clipExtractor.Clip(media, start, duration, args[1]);
src/Cli/Properties/launchSettings.json
+3
-2
diff --git a/src/Cli/Properties/launchSettings.json b/src/Cli/Properties/launchSettings.json
index 9234c25..2c6eba0 100644
@@ -6,8 +6,9 @@
"dotnetRunMessages": true,
"launchBrowser": false,
"environmentVariables": {
"ENVIRONMENT": "Development"
}
"DOTNET_ENVIRONMENT": "Development"
},
"commandLineArgs": "D:/slopper/media/S02E06.mkv"
}
}
}
src/Cli/appsettings.Development.json
+24
-0
diff --git a/src/Cli/appsettings.Development.json b/src/Cli/appsettings.Development.json
index 6113e34..af7d375 100644
@@ -4,5 +4,29 @@
"Default": "Information",
"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/Cli/packages.lock.json
+83
-22
diff --git a/src/Cli/packages.lock.json b/src/Cli/packages.lock.json
index 9ed0590..b785765 100644
@@ -339,27 +339,6 @@
"Microsoft.Extensions.Primitives": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"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": "Transitive",
"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"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
@@ -410,10 +389,27 @@
"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.Logging.Abstractions": "[11.0.0-preview.3.26207.106, )"
"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": {
@@ -467,6 +463,39 @@
"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",
"Microsoft.Extensions.Caching.Abstractions": "10.0.6",
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.6",
"Microsoft.Extensions.Logging.Abstractions": "10.0.6",
"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.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, )",
@@ -476,6 +505,38 @@
"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"
}
},
"SubtitlesParserV2": {
"type": "CentralTransitive",
"requested": "[2.4.0, )",
src/Domain/ClipSelector.cs
+105
-0
diff --git a/src/Domain/ClipSelector.cs b/src/Domain/ClipSelector.cs
new file mode 100644
index 0000000..7d2aa62
@@ -0,0 +1,105 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace Slopper.Domain;
public sealed class ClipSelector(
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator,
IOptions<ClipSelectorOptions> options
)
{
private readonly Lazy<Task<IReadOnlyList<Embedding<float>>>> clippableQuotesEmbeddings = new(async () =>
await embeddingGenerator.GenerateAsync(options.Value.ClippableQuotes)
);
public async Task<(TimeSpan start, TimeSpan duration)> PickClip(
IReadOnlyList<SubtitleEntry> subtitles,
CancellationToken cancellationToken
)
{
if (subtitles is [])
{
throw new ArgumentException("Subtitles cannot be empty", nameof(subtitles));
}
var subtitleLines = subtitles.SelectMany(s => s.Lines);
var subtitleEmbeddings = await embeddingGenerator.GenerateAsync(
subtitleLines,
cancellationToken: cancellationToken
);
var bestMatch = FindBestMatch(
subtitleEmbeddings.Zip(subtitles.SelectMany(s => s.Lines.Select(_ => s))),
await clippableQuotesEmbeddings.Value
);
return (bestMatch.Start, bestMatch.Duration);
}
private static SubtitleEntry FindBestMatch(
IEnumerable<(Embedding<float> embedding, SubtitleEntry subtitle)> subtitleEmbeddings,
IReadOnlyList<Embedding<float>> clippableQuotesEmbeddings
) => subtitleEmbeddings.MaxBy(p => CalculateSimilarity(p.embedding, clippableQuotesEmbeddings)).subtitle;
private static float CalculateSimilarity(
Embedding<float> subtitleEmbedding,
IReadOnlyList<Embedding<float>> clippableQuotesEmbeddings
) => clippableQuotesEmbeddings.Max(qe => CalculateEmbeddingSimilarity(subtitleEmbedding, qe));
private static float CalculateEmbeddingSimilarity(Embedding<float> a, Embedding<float> b)
{
var vectorA = a.Vector.Span;
var vectorB = b.Vector.Span;
float dotProduct = 0.0f;
float magnitudeA = 0.0f;
float magnitudeB = 0.0f;
int count = int.Min(vectorA.Length, vectorB.Length);
for (int i = 0; i < count; i++)
{
dotProduct += vectorA[i] * vectorB[i];
magnitudeA += vectorA[i] * vectorA[i];
magnitudeB += vectorB[i] * vectorB[i];
}
if (magnitudeA <= 0.0f || magnitudeB <= 0.0f)
{
return 0.0f;
}
return dotProduct / (float.Sqrt(magnitudeA) * float.Sqrt(magnitudeB));
}
}
public sealed class ClipSelectorOptions
{
[Required, MinLength(1)]
public required IReadOnlyList<string> ClippableQuotes { get; set; }
}
[OptionsValidator]
internal sealed partial class ClipSelectorOptionsValidator : IValidateOptions<ClipSelectorOptions>;
public static class ClipSelectorServiceCollectionExtensions
{
extension(IServiceCollection services)
{
public IServiceCollection AddClipSelector()
{
services.AddOptions<ClipSelectorOptions>().BindConfiguration("ClipSelector").ValidateOnStart();
services.AddTransient<IValidateOptions<ClipSelectorOptions>, ClipSelectorOptionsValidator>();
services.AddSingleton<ClipSelector>();
return services;
}
}
}
src/Domain/Domain.csproj
+3
-0
diff --git a/src/Domain/Domain.csproj b/src/Domain/Domain.csproj
index 0c691f1..46513c8 100644
@@ -4,6 +4,9 @@
<AssemblyName>Slopper.Domain</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.AI.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Options" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
</ItemGroup>
</Project>
src/Domain/packages.lock.json
+60
-0
diff --git a/src/Domain/packages.lock.json b/src/Domain/packages.lock.json
index 2eb7775..a63ab9a 100644
@@ -8,6 +8,12 @@
"resolved": "1.2.6",
"contentHash": "KMSJG+jfk7vjP52QkWB99qWespXCPAzG/IaMCMRHYWumJEAGKQYm2HtyWG6eqnOwDitH96i1cqq5EVesyOtPmg=="
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "Direct",
"requested": "[10.5.2, )",
"resolved": "10.5.2",
"contentHash": "Ei+YWV9Ybnps7pR1dgjlG29gelXEwZkhLVAcWmKe6HvXS6LNBYgSdWiY3Hk9OZXYtK34rv/NtLWBQYQGOBQYPQ=="
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "Direct",
"requested": "[11.0.0-preview.3.26207.106, )",
@@ -17,10 +23,64 @@
"Microsoft.Extensions.DependencyInjection.Abstractions": "11.0.0-preview.3.26207.106"
}
},
"Microsoft.Extensions.Options": {
"type": "Direct",
"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": "Direct",
"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"
}
},
"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.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "+gJnv1/kfXLXPv21R3iluhKqfXdf2zPWUaHBiSvlJurThv2D5HRUfU5z5SpmBII4I0JSpuprX9DlHrKz/1wCXA=="
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "IBOlwyX13ax6/fXA7AoZFswKFytta9TExBv3/8qemMJGBoDXYlQEcw4WerHQCvmerJ5uP2o8bjIAvxcNdTZVLQ=="
}
},
"net11.0/linux-arm64": {},
src/Infrastructure/Ai/Ai.csproj
+14
-0
diff --git a/src/Infrastructure/Ai/Ai.csproj b/src/Infrastructure/Ai/Ai.csproj
new file mode 100644
index 0000000..ae6fe2d
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RootNamespace>Slopper.Infrastructure.Ai</RootNamespace>
<AssemblyName>Slopper.Infrastructure.Ai</AssemblyName>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Domain\Domain.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.AI" />
<PackageReference Include="Microsoft.Extensions.Http" />
<PackageReference Include="OllamaSharp" />
</ItemGroup>
</Project>
src/Infrastructure/Ai/EmbeddingOptions.cs
+19
-0
diff --git a/src/Infrastructure/Ai/EmbeddingOptions.cs b/src/Infrastructure/Ai/EmbeddingOptions.cs
new file mode 100644
index 0000000..9f4aee1
@@ -0,0 +1,19 @@
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.Extensions.Options;
namespace Slopper.Infrastructure.Ai;
internal sealed class EmbeddingOptions
{
[Required]
public required string Model { get; set; }
public string? BasicAuth { get; set; }
[Required]
public required Uri Endpoint { get; set; }
}
[OptionsValidator]
internal sealed partial class EmbeddingOptionsValidator : IValidateOptions<EmbeddingOptions>;
src/Infrastructure/Ai/ServiceCollectionExtensions.cs
+35
-0
diff --git a/src/Infrastructure/Ai/ServiceCollectionExtensions.cs b/src/Infrastructure/Ai/ServiceCollectionExtensions.cs
new file mode 100644
index 0000000..c16a607
@@ -0,0 +1,35 @@
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using OllamaSharp;
namespace Slopper.Infrastructure.Ai;
public static class ServiceCollectionExtensions
{
extension(IServiceCollection services)
{
public IServiceCollection AddAi()
{
services.AddOptions<EmbeddingOptions>().BindConfiguration("Embedding").ValidateOnStart();
services.AddTransient<IValidateOptions<EmbeddingOptions>, EmbeddingOptionsValidator>();
services.AddHttpClient<OllamaApiClient, OllamaApiClient>(
(client, sp) =>
{
var options = sp.GetRequiredService<IOptions<EmbeddingOptions>>().Value;
client.BaseAddress = options.Endpoint;
if (options.BasicAuth is not null)
{
client.DefaultRequestHeaders.Authorization = new("Basic", options.BasicAuth);
}
return new OllamaApiClient(client, options.Model);
}
);
services.AddEmbeddingGenerator(sp => sp.GetRequiredService<OllamaApiClient>()).UseOpenTelemetry();
return services;
}
}
}
src/Infrastructure/Ai/packages.lock.json
+188
-0
diff --git a/src/Infrastructure/Ai/packages.lock.json b/src/Infrastructure/Ai/packages.lock.json
new file mode 100644
index 0000000..17984d4
@@ -0,0 +1,188 @@
{
"version": 2,
"dependencies": {
"net11.0": {
"CSharpier.MsBuild": {
"type": "Direct",
"requested": "[1.2.6, )",
"resolved": "1.2.6",
"contentHash": "KMSJG+jfk7vjP52QkWB99qWespXCPAzG/IaMCMRHYWumJEAGKQYm2HtyWG6eqnOwDitH96i1cqq5EVesyOtPmg=="
},
"Microsoft.Extensions.AI": {
"type": "Direct",
"requested": "[10.5.2, )",
"resolved": "10.5.2",
"contentHash": "nmhzep22lJmDvv15wDlM+bwhr3o4G+hTTrIL9veNmXqtsJdpNkh2JAz1UMy72AqVPuysSDMLajuOLsLqSuyH4A==",
"dependencies": {
"Microsoft.Extensions.AI.Abstractions": "10.5.2",
"Microsoft.Extensions.Caching.Abstractions": "10.0.6",
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.6",
"Microsoft.Extensions.Logging.Abstractions": "10.0.6",
"System.Numerics.Tensors": "10.0.6"
}
},
"Microsoft.Extensions.Http": {
"type": "Direct",
"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"
}
},
"OllamaSharp": {
"type": "Direct",
"requested": "[5.4.25, )",
"resolved": "5.4.25",
"contentHash": "EqkPM1gbkE+RbHgKUMzp4lYjpFymWUIgJntx3u4uDXAfAIFUXJ0MGklNFCi/PdCaxNAPRpcf205yx+g6jLLhZg==",
"dependencies": {
"Microsoft.Extensions.AI.Abstractions": "10.4.1"
}
},
"Microsoft.Extensions.Caching.Abstractions": {
"type": "Transitive",
"resolved": "10.0.6",
"contentHash": "Ilr690V+E1H116ncF00KIlvRloKXBdCExaNqcT9BvCcS5nFGR1pcTamSA2EI8pOXbNp0DHZm8K8h6Wl1hMSbIQ==",
"dependencies": {
"Microsoft.Extensions.Primitives": "10.0.6"
}
},
"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.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.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.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.Primitives": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "IBOlwyX13ax6/fXA7AoZFswKFytta9TExBv3/8qemMJGBoDXYlQEcw4WerHQCvmerJ5uP2o8bjIAvxcNdTZVLQ=="
},
"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, )"
}
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
"requested": "[10.5.2, )",
"resolved": "10.5.2",
"contentHash": "Ei+YWV9Ybnps7pR1dgjlG29gelXEwZkhLVAcWmKe6HvXS6LNBYgSdWiY3Hk9OZXYtK34rv/NtLWBQYQGOBQYPQ=="
},
"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"
}
}
},
"net11.0/linux-arm64": {},
"net11.0/linux-x64": {},
"net11.0/osx-arm64": {},
"net11.0/osx-x64": {},
"net11.0/win-arm64": {},
"net11.0/win-x64": {}
}
}
\ No newline at end of file
src/Infrastructure/Database/packages.lock.json
+56
-15
diff --git a/src/Infrastructure/Database/packages.lock.json b/src/Infrastructure/Database/packages.lock.json
index b116cf1..b50bb48 100644
@@ -202,12 +202,30 @@
"Microsoft.Extensions.Primitives": "10.0.7"
}
},
"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": "10.0.7",
"contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "DAFozg1P/fA2yh36sYLS/NMDxGCFATUFNYbgQi1wbkFT2cFYqEsK/VYbTXsiXKQfr3G/d4Rnorpe0In2WBaMIA==",
"dependencies": {
"Microsoft.Extensions.Primitives": "10.0.7"
"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.DependencyInjection": {
@@ -238,19 +256,10 @@
"Microsoft.Extensions.Options": "10.0.7"
}
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "10.0.7",
"contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7",
"Microsoft.Extensions.Primitives": "10.0.7"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "10.0.7",
"contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw=="
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "IBOlwyX13ax6/fXA7AoZFswKFytta9TExBv3/8qemMJGBoDXYlQEcw4WerHQCvmerJ5uP2o8bjIAvxcNdTZVLQ=="
},
"Microsoft.VisualStudio.SolutionPersistence": {
"type": "Transitive",
@@ -366,9 +375,18 @@
"Slopper.Domain": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[11.0.0-preview.3.26207.106, )"
"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, )"
}
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
"requested": "[10.5.2, )",
"resolved": "10.5.2",
"contentHash": "Ei+YWV9Ybnps7pR1dgjlG29gelXEwZkhLVAcWmKe6HvXS6LNBYgSdWiY3Hk9OZXYtK34rv/NtLWBQYQGOBQYPQ=="
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.3.26207.106, )",
@@ -377,6 +395,29 @@
"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"
}
}
},
"net11.0/linux-arm64": {
src/Infrastructure/Ffmpeg/packages.lock.json
+64
-1
diff --git a/src/Infrastructure/Ffmpeg/packages.lock.json b/src/Infrastructure/Ffmpeg/packages.lock.json
index 6803c40..72c0e1e 100644
@@ -40,15 +40,78 @@
"resolved": "3.0.2",
"contentHash": "LfhegDpmA8PuHW58RmgVvCDG/mfVCTU+Vhy4ppmXLJfAer33Xl0NocDy92OwSL6CnkVdx41O/I0+BjNhU1JtMQ=="
},
"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.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "+gJnv1/kfXLXPv21R3iluhKqfXdf2zPWUaHBiSvlJurThv2D5HRUfU5z5SpmBII4I0JSpuprX9DlHrKz/1wCXA=="
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "11.0.0-preview.3.26207.106",
"contentHash": "IBOlwyX13ax6/fXA7AoZFswKFytta9TExBv3/8qemMJGBoDXYlQEcw4WerHQCvmerJ5uP2o8bjIAvxcNdTZVLQ=="
},
"Slopper.Domain": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[11.0.0-preview.3.26207.106, )"
"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, )"
}
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
"requested": "[10.5.2, )",
"resolved": "10.5.2",
"contentHash": "Ei+YWV9Ybnps7pR1dgjlG29gelXEwZkhLVAcWmKe6HvXS6LNBYgSdWiY3Hk9OZXYtK34rv/NtLWBQYQGOBQYPQ=="
},
"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"
}
}
},