Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
* develop:
  Version bump to v8.23.0
  Adding a method that will return a new range from current hashes object relative to startsAt and with corresponding length.
  • Loading branch information
AddictedCS committed May 15, 2023
2 parents 86d3782 + 67f7cb1 commit 613e3b9
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 15 deletions.
4 changes: 2 additions & 2 deletions src/SoundFingerprinting.Tests/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
25 changes: 22 additions & 3 deletions src/SoundFingerprinting.Tests/Unit/Data/HashesTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand All @@ -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);
Expand Down
40 changes: 34 additions & 6 deletions src/SoundFingerprinting/Data/Hashes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,34 @@ IEnumerator IEnumerable.GetEnumerator()
return GetEnumerator();
}

/// <summary>
/// Gets new range from the current hashes object.
/// </summary>
/// <param name="startsAt">Starting at second.</param>
/// <param name="length">Length in seconds of the new <see cref="Hashes"/> object.</param>
/// <returns>New hashes object.</returns>
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<HashedFingerprint>(), 0, MediaType, RelativeTo) : NewHashes(filtered, lengthOfOneFingerprint);
}

/// <summary>
/// Gets new range from the current hashes object.
/// </summary>
Expand All @@ -316,18 +344,18 @@ public Hashes GetRange(DateTime startsAt, float length)
})
.ToList();

if (!filtered.Any())
{
return new Hashes(Enumerable.Empty<HashedFingerprint>(), 0, MediaType, startsAt);
}
return !filtered.Any() ? new Hashes(Enumerable.Empty<HashedFingerprint>(), 0, MediaType, startsAt) : NewHashes(filtered, lengthOfOneFingerprint);
}

private Hashes NewHashes(IReadOnlyCollection<HashedFingerprint> 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<HashedFingerprint> ShiftStartsAtAccordingToSelectedRange(List<HashedFingerprint> filtered)
private static List<HashedFingerprint> ShiftStartsAtAccordingToSelectedRange(IReadOnlyCollection<HashedFingerprint> filtered)
{
var startsAtShift = filtered.First().StartsAt;
return filtered.Select((fingerprint,
Expand Down
4 changes: 2 additions & 2 deletions src/SoundFingerprinting/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
4 changes: 2 additions & 2 deletions src/SoundFingerprinting/SoundFingerprinting.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Nullable>enable</Nullable>
<PackageVersion>8.22.0</PackageVersion>
<PackageVersion>8.23.0</PackageVersion>
<Authors>Sergiu Ciumac</Authors>
<PackageDescription>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.</PackageDescription>
<PackageProjectUrl>https://github.com/addictedcs/soundfingerprinting</PackageProjectUrl>
<RepositoryUrl>https://github.com/AddictedCS/soundfingerprinting</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageReleaseNotes>
Adding ToString override to a couple of classes used in the API.
Adding GetRange method to Hashes object.
</PackageReleaseNotes>
<PackageTags>Audio Video Identification Fingerprinting Digital Signal Processing Music Recognition Data Mining Content Sound Shazam</PackageTags>
<LangVersion>latest</LangVersion>
Expand Down

0 comments on commit 613e3b9

Please sign in to comment.