6ccf002e51
* Recaps and Previews Support * Add draft UI of preview / recap edit * remove intro/credit tasks * Update configPage.html * rename task * Reorganize settings by relation * More standardized formatting * Some additional formatting * fix a typo * Update configPage.html * Allow missing recap / prview data * More risk to corrupt than benefit * Update TimeStamps.cs * Update PluginConfiguration.cs * Update configPage.html * Update PluginConfiguration.cs * Add chapter regex to settings * Move all UI into UI section * Move ending seconds with similar * Add default * fixes * Update SkipIntroController.cs * Autoskip all segments * Check if adjacent segment * Update AutoSkip.cs * Update AutoSkip.cs * Settings apply to all segment types * Update SegmentProvider * Update configPage.html Whoops * Update Plugin.cs * Update AutoSkip.cs * Let’s call it missing instead * Update BaseItemAnalyzerTask.cs * Update BaseItemAnalyzerTask.cs * Update BaseItemAnalyzerTask.cs * Move "select" all below list * Clarify button wording * Update configPage.html * Nope, long client list will hide it * Simplify wording * Update QueuedEpisode.cs * fix unit test for ffmpeg7 * Add migration * Restore DataContract * update * Update configPage.html * remove analyzed status * Update AutoSkip.cs * Update configPage.html typo * Store analyzed items in seasoninfo * Update VisualizationController.cs * update * Update IntroSkipperDbContext.cs * Add preview / recap delete * This keeps changing itself * Update SkipIntroController.cs * Rather add it to be removed --------- Co-authored-by: rlauu <46294892+rlauu@users.noreply.github.com> Co-authored-by: TwistedUmbrellaX <1173913+AbandonedCart@users.noreply.github.com> Co-authored-by: Kilian von Pflugk <github@jumoog.io>
79 lines
2.1 KiB
C#
79 lines
2.1 KiB
C#
// Copyright (C) 2024 Intro-Skipper contributors <intro-skipper.org>
|
|
// SPDX-License-Identifier: GPL-3.0-only.
|
|
|
|
namespace IntroSkipper.Tests;
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using IntroSkipper.Analyzers;
|
|
using IntroSkipper.Data;
|
|
using Microsoft.Extensions.Logging;
|
|
using Xunit;
|
|
|
|
public class TestBlackFrames
|
|
{
|
|
[FactSkipFFmpegTests]
|
|
public void TestBlackFrameDetection()
|
|
{
|
|
var range = 1e-5;
|
|
|
|
var expected = new List<BlackFrame>();
|
|
expected.AddRange(CreateFrameSequence(2, 3));
|
|
expected.AddRange(CreateFrameSequence(5, 6));
|
|
expected.AddRange(CreateFrameSequence(8, 9.96));
|
|
|
|
var actual = FFmpegWrapper.DetectBlackFrames(QueueFile("rainbow.mp4"), new(0, 10), 85);
|
|
|
|
for (var i = 0; i < expected.Count; i++)
|
|
{
|
|
var (e, a) = (expected[i], actual[i]);
|
|
Assert.Equal(e.Percentage, a.Percentage);
|
|
Assert.InRange(a.Time, e.Time - range, e.Time + range);
|
|
}
|
|
}
|
|
|
|
[FactSkipFFmpegTests]
|
|
public void TestEndCreditDetection()
|
|
{
|
|
// new strategy new range
|
|
var range = 3;
|
|
|
|
var analyzer = CreateBlackFrameAnalyzer();
|
|
|
|
var episode = QueueFile("credits.mp4");
|
|
episode.Duration = (int)new TimeSpan(0, 5, 30).TotalSeconds;
|
|
|
|
var result = analyzer.AnalyzeMediaFile(episode, 240, 85);
|
|
Assert.NotNull(result);
|
|
Assert.InRange(result.Start, 300 - range, 300 + range);
|
|
}
|
|
|
|
private static QueuedEpisode QueueFile(string path)
|
|
{
|
|
return new()
|
|
{
|
|
EpisodeId = Guid.NewGuid(),
|
|
Name = path,
|
|
Path = "../../../video/" + path
|
|
};
|
|
}
|
|
|
|
private static BlackFrame[] CreateFrameSequence(double start, double end)
|
|
{
|
|
var frames = new List<BlackFrame>();
|
|
|
|
for (var i = start; i < end; i += 0.04)
|
|
{
|
|
frames.Add(new(100, i));
|
|
}
|
|
|
|
return [.. frames];
|
|
}
|
|
|
|
private static BlackFrameAnalyzer CreateBlackFrameAnalyzer()
|
|
{
|
|
var logger = new LoggerFactory().CreateLogger<BlackFrameAnalyzer>();
|
|
return new(logger);
|
|
}
|
|
}
|