using Flaro.Core.Media; namespace Flaro.Core.Tests; /// Der Abgleich an echten Chromaprint-Abdrücken. /// /// /// Bisher nur mit erfundenen Zahlen geprüft. Die sagen, ob die Suche /// rechnet; sie sagen nicht, ob die Schwellen zu echtem Material passen. /// Genau dazwischen kann alles liegen: zwei Aufnahmen desselben Stücks sind /// nie bitgleich, und wie unähnlich sie sind, weiss man erst, wenn man es /// misst. /// /// Die beiden Abdrücke liegen als Prüfdaten daneben: zwei Tonspuren mit /// demselben dreissigsekündigen Stück an verschiedenen Stellen und in /// verschiedener Bitrate, durch fpcalc gedreht. Zwanzig Kilobyte /// Text — der Preis dafür, dass diese Zusage nicht bloss behauptet ist. /// public class EchteFingerprintsTests { private const double JeFingerprint = 4096.0 / 3.0 / 11025.0; private static IReadOnlyList? Lesen(string name) { var pfad = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fingerprints", name); if (!File.Exists(pfad)) return null; return File.ReadAllText(pfad) .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .Select(t => unchecked((uint)long.Parse(t))) .ToList(); } [Test] public void Dasselbe_Stueck_wird_in_zwei_Aufnahmen_gefunden() { var a = Lesen("folgeA.txt"); var b = Lesen("folgeB.txt"); if (a is null || b is null) Assert.Ignore("Keine Abdrücke zum Prüfen da."); var treffer = Fingerprintabgleich.Finden(a, b, JeFingerprint); TestContext.Out.WriteLine($"A {a.Count} Werte, B {b.Count} Werte"); TestContext.Out.WriteLine(treffer is null ? "NICHTS GEFUNDEN" : $"A {treffer.AVon:0.0}–{treffer.ABis:0.0} s, B {treffer.BVon:0.0}–{treffer.BBis:0.0} s"); Assert.That(treffer, Is.Not.Null, "das Stück steckt in beiden"); Assert.Multiple(() => { Assert.That(treffer!.AVon, Is.EqualTo(20).Within(3)); Assert.That(treffer.BVon, Is.EqualTo(75).Within(3)); Assert.That(treffer.Laenge, Is.EqualTo(30).Within(4)); }); } }