mirror of
https://github.com/unclshura/splitter.git
synced 2026-06-21 16:12:01 +00:00
76 lines
2.4 KiB
C#
76 lines
2.4 KiB
C#
namespace Splitter_UI.Services;
|
|
|
|
public sealed class AutoDecisionService(IThumbnailService _thumbnails, IFileProbeService _fileProbe, ILogger _log) : IAutoDecisionService
|
|
{
|
|
public void ApplyAutoDecisions(JobViewModel job, CancellationToken token)
|
|
{
|
|
Task.Run(() => Detect(job, token));
|
|
}
|
|
|
|
private async Task Detect(JobViewModel job, CancellationToken token)
|
|
{
|
|
try
|
|
{
|
|
job.GravitateTo = new(0.5f, 0.5f);
|
|
job.OverrideTargetDuration = 58.0;
|
|
job.Mask = "[NAME]_seg[NN].[EXT]";
|
|
job.OutputFolder = Path.Combine(Path.GetDirectoryName(job.InputFile)!, "splitter");
|
|
|
|
job.Probe = await _fileProbe.ProbeAsync(job.InputFile, token);
|
|
job.Thumbnail = await _thumbnails.CreateThumbnailAsync(job.InputFile, job.Probe, rotateDegree: job.Rotate);
|
|
|
|
if (job.Probe.Width > job.Probe.Height)
|
|
{
|
|
job.Detect = "body";
|
|
job.Rotate = 0;
|
|
|
|
CalculateCrop(job);
|
|
}
|
|
//else
|
|
//{
|
|
// var sampler = new VideoRotationSampler(null);
|
|
// job.Rotate = await sampler.DetectRotationAsync(job.InputFile, job.Probe.Duration, token);
|
|
// job.Detect = job.Rotate == 0 ? null : "body";
|
|
//}
|
|
|
|
_log.LogInfo(job.ToString());
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_log.LogError($"Error creating thumbnail for {Path.GetFileName(job.InputFile)}: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
private static void CalculateCrop(JobViewModel job)
|
|
{
|
|
var targetAR = (float)CommandLine.DefaultW / CommandLine.DefaultH;
|
|
var pixelAspect = job.Probe!.Sar.X / job.Probe.Sar.Y;
|
|
|
|
var srcW = job.Probe.Width * pixelAspect;
|
|
float srcH = job.Probe.Height;
|
|
var srcAR = srcW / srcH;
|
|
|
|
var cropH = srcH;
|
|
var cropW = cropH * targetAR;
|
|
|
|
if (cropW > srcW)
|
|
{
|
|
cropW = srcW;
|
|
cropH = cropW / targetAR;
|
|
}
|
|
|
|
var x = (srcW - cropW) * 0.5f;
|
|
var y = (srcH - cropH) * 0.5f;
|
|
|
|
var invPixelAspect = 1f / pixelAspect;
|
|
|
|
var cropW_px = cropW * invPixelAspect;
|
|
var cropH_px = cropH;
|
|
|
|
var x_px = x * invPixelAspect;
|
|
var y_px = y;
|
|
|
|
job.CropText = $"{(int)MathF.Round(cropW_px)},{(int)MathF.Round(cropH_px)}";
|
|
}
|
|
}
|