From d4f3a11651033ed3299c25330f054e1284f206fc Mon Sep 17 00:00:00 2001 From: Sergiu Ciumac Date: Mon, 15 May 2023 15:50:13 +0300 Subject: [PATCH 1/2] Adding a method that will return a new range from current hashes object relative to startsAt and with corresponding length. --- .../Unit/Data/HashesTest.cs | 25 ++++++++++-- src/SoundFingerprinting/Data/Hashes.cs | 40 ++++++++++++++++--- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/SoundFingerprinting.Tests/Unit/Data/HashesTest.cs b/src/SoundFingerprinting.Tests/Unit/Data/HashesTest.cs index c5ce5dcf..5612d4ba 100644 --- a/src/SoundFingerprinting.Tests/Unit/Data/HashesTest.cs +++ b/src/SoundFingerprinting.Tests/Unit/Data/HashesTest.cs @@ -7,9 +7,7 @@ namespace SoundFingerprinting.Tests.Unit.Data using System.Linq; using NUnit.Framework; using ProtoBuf; - using SoundFingerprinting.Audio; using SoundFingerprinting.Data; - using SoundFingerprinting.Strides; [TestFixture] public class HashesTest @@ -146,6 +144,27 @@ public void ShouldMergeNonOverlappingSequences() AssertHashesAreEqual(b, rangeB); AssertInvariantsForHashes(rangeB, bStartsAt); } + + [Test] + public void ShouldReturnRangeHashes() + { + var dtfi = CultureInfo.GetCultureInfo("en-US").DateTimeFormat; + int count = 80; + var aStartsAt = DateTime.Parse("01/15/2019 10:00:00", dtfi); + var a = new Hashes(GetHashedFingerprints(count), count * 1.48f, MediaType.Audio, aStartsAt); + var bStartsAt = DateTime.Parse("01/15/2019 10:01:58.4", dtfi); + var b = new Hashes(GetHashedFingerprints(count), count * 1.48f, MediaType.Audio, bStartsAt); + + var c = a.MergeWith(b); + Assert.AreEqual(count * 2, c.Count); + + var rangeA = c.GetRange(0, count * 1.48f); + AssertHashesAreEqual(a, rangeA); + AssertInvariantsForHashes(rangeA, aStartsAt); + var rangeB = c.GetRange(count * 1.48f, count * 1.48f); + AssertHashesAreEqual(b, rangeB); + AssertInvariantsForHashes(rangeB, bStartsAt); + } [Test] public void ShouldMergeCorrectlyRealtimeHashes() @@ -160,7 +179,7 @@ public void ShouldMergeCorrectlyRealtimeHashes() private static void AssertInvariantsForHashes(Hashes hashes, DateTime startsAt) { - Assert.AreEqual(startsAt, hashes.RelativeTo); + Assert.AreEqual((startsAt - hashes.RelativeTo).TotalSeconds, 0, 0.1); var list = hashes.ToList(); Assert.AreEqual(0, list.First().StartsAt); Assert.AreEqual(0, list.First().SequenceNumber); diff --git a/src/SoundFingerprinting/Data/Hashes.cs b/src/SoundFingerprinting/Data/Hashes.cs index 03116ef3..f01a8e91 100644 --- a/src/SoundFingerprinting/Data/Hashes.cs +++ b/src/SoundFingerprinting/Data/Hashes.cs @@ -291,6 +291,34 @@ IEnumerator IEnumerable.GetEnumerator() return GetEnumerator(); } + /// + /// Gets new range from the current hashes object. + /// + /// Starting at second. + /// Length in seconds of the new object. + /// New hashes object. + public Hashes GetRange(double startsAt, float length) + { + if (IsEmpty) + { + return GetEmpty(MediaType); + } + + double endsAt = startsAt + length; + var ordered = fingerprints.OrderBy(_ => _.SequenceNumber).ToList(); + var lengthOfOneFingerprint = DurationInSeconds - ordered.Last().StartsAt; + + var filtered = ordered.Where(fingerprint => + { + float fingerprintStartsAt = fingerprint.StartsAt; + double fingerprintEndsAt = fingerprint.StartsAt + lengthOfOneFingerprint; + return fingerprintStartsAt >= startsAt && fingerprintEndsAt <= endsAt; + }) + .ToList(); + + return !filtered.Any() ? new Hashes(Enumerable.Empty(), 0, MediaType, RelativeTo) : NewHashes(filtered, lengthOfOneFingerprint); + } + /// /// Gets new range from the current hashes object. /// @@ -316,18 +344,18 @@ public Hashes GetRange(DateTime startsAt, float length) }) .ToList(); - if (!filtered.Any()) - { - return new Hashes(Enumerable.Empty(), 0, MediaType, startsAt); - } + return !filtered.Any() ? new Hashes(Enumerable.Empty(), 0, MediaType, startsAt) : NewHashes(filtered, lengthOfOneFingerprint); + } + private Hashes NewHashes(IReadOnlyCollection filtered, double lengthOfOneFingerprint) + { var relativeTo = RelativeTo.AddSeconds(filtered.First().StartsAt); var duration = filtered.Last().StartsAt - filtered.First().StartsAt + lengthOfOneFingerprint; var shifted = ShiftStartsAtAccordingToSelectedRange(filtered); - return new Hashes(shifted, duration, MediaType, relativeTo, Origins, StreamId, additionalProperties ?? emptyDictionary, 0); + return new Hashes(shifted, duration, MediaType, relativeTo, Origins, StreamId, additionalProperties ?? emptyDictionary, timeOffset: 0); } - private static List ShiftStartsAtAccordingToSelectedRange(List filtered) + private static List ShiftStartsAtAccordingToSelectedRange(IReadOnlyCollection filtered) { var startsAtShift = filtered.First().StartsAt; return filtered.Select((fingerprint, From 67f7cb1c55806205b098f3bcd05a084916cafeb1 Mon Sep 17 00:00:00 2001 From: Sergiu Ciumac Date: Mon, 15 May 2023 15:55:09 +0300 Subject: [PATCH 2/2] Version bump to v8.23.0 --- src/SoundFingerprinting.Tests/Properties/AssemblyInfo.cs | 4 ++-- src/SoundFingerprinting/Properties/AssemblyInfo.cs | 4 ++-- src/SoundFingerprinting/SoundFingerprinting.csproj | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/SoundFingerprinting.Tests/Properties/AssemblyInfo.cs b/src/SoundFingerprinting.Tests/Properties/AssemblyInfo.cs index 3d3681b7..ff81a356 100644 --- a/src/SoundFingerprinting.Tests/Properties/AssemblyInfo.cs +++ b/src/SoundFingerprinting.Tests/Properties/AssemblyInfo.cs @@ -11,5 +11,5 @@ [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("4cac962e-ebc5-4006-a1e0-7ffb3e2483c2")] -[assembly: AssemblyVersion("8.22.0.100")] -[assembly: AssemblyInformationalVersion("8.22.0.100")] +[assembly: AssemblyVersion("8.23.0.100")] +[assembly: AssemblyInformationalVersion("8.23.0.100")] diff --git a/src/SoundFingerprinting/Properties/AssemblyInfo.cs b/src/SoundFingerprinting/Properties/AssemblyInfo.cs index e1c25f46..53536274 100644 --- a/src/SoundFingerprinting/Properties/AssemblyInfo.cs +++ b/src/SoundFingerprinting/Properties/AssemblyInfo.cs @@ -19,5 +19,5 @@ [assembly: InternalsVisibleTo("SoundFingerprinting.FFT.FFTW")] [assembly: InternalsVisibleTo("SoundFingerprinting.FFT.FFTW.Tests")] -[assembly: AssemblyVersion("8.22.0.100")] -[assembly: AssemblyInformationalVersion("8.22.0.100")] +[assembly: AssemblyVersion("8.23.0.100")] +[assembly: AssemblyInformationalVersion("8.23.0.100")] diff --git a/src/SoundFingerprinting/SoundFingerprinting.csproj b/src/SoundFingerprinting/SoundFingerprinting.csproj index 61a497d0..13a8a93d 100644 --- a/src/SoundFingerprinting/SoundFingerprinting.csproj +++ b/src/SoundFingerprinting/SoundFingerprinting.csproj @@ -4,14 +4,14 @@ true false enable - 8.22.0 + 8.23.0 Sergiu Ciumac SoundFingerprinting is a C# framework that implements an efficient algorithm of audio fingerprinting and identification. Designed for developers, enthusiasts, researchers in the fields of audio processing, data mining, digital signal processing. https://github.com/addictedcs/soundfingerprinting https://github.com/AddictedCS/soundfingerprinting git - Adding ToString override to a couple of classes used in the API. + Adding GetRange method to Hashes object. Audio Video Identification Fingerprinting Digital Signal Processing Music Recognition Data Mining Content Sound Shazam latest