public void ReadMultipleTracksTest()
        {
            const int numberOfTracks = 100;

            for (int i = 0; i < numberOfTracks; i++)
            {
                var track = new TrackInfo($"id{i}", "title", "artist");
                modelService.Insert(track, new Hashes(new[] { new HashedFingerprint(GenericHashBuckets(), 0, 0f, Array.Empty <byte>()) }, 1.48d, DateTime.Now, Enumerable.Empty <string>()));
            }

            var actualTracks = modelService.ReadAllTracks().ToList();

            Assert.AreEqual(numberOfTracks, actualTracks.Count);
        }
Example #2
0
        public void ReadMultipleTracksTest()
        {
            const int NumberOfTracks = 100;
            var       allTracks      = new HashSet <TrackData>();

            for (int i = 0; i < NumberOfTracks; i++)
            {
                TrackData track = new TrackData("isrc" + i, "artist", "title", "album", 1986, 200);
                modelService.InsertTrack(track);
                if (!allTracks.Add(track))
                {
                    Assert.Fail("Same primary key identifier was returned after inserting a track to the collection.");
                }
            }

            var actualTracks = modelService.ReadAllTracks();

            Assert.AreEqual(NumberOfTracks, actualTracks.Count);
        }
Example #3
0
        /// <summary>
        ///   Find duplicates between existing tracks in the database
        /// </summary>
        /// <param name = "callback">Callback invoked at each processed track</param>
        /// <returns>Sets of duplicates</returns>
        public HashSet <TrackData>[] FindDuplicates(Action <TrackData, int, int> callback)
        {
            var tracks = modelService.ReadAllTracks().ToList();
            var duplicates = new List <HashSet <TrackData> >();
            int total = tracks.Count, current = 0;
            var queryConfiguration = new DefaultQueryConfiguration {
                MaxTracksToReturn = int.MaxValue, ThresholdVotes = 4
            };

            foreach (var track in tracks)
            {
                var trackDuplicates = new HashSet <TrackData>();

                var hashedFingerprints = modelService.ReadHashedFingerprintsByTrack(track.TrackReference);
                var max    = hashedFingerprints.Max(_ => _.StartsAt);
                var min    = hashedFingerprints.Min(_ => _.StartsAt);
                var hashes = new Hashes(hashedFingerprints, GetLength(min, max, queryConfiguration.FingerprintConfiguration.FingerprintLengthInSeconds));
                var result = queryFingerprintService.Query(hashes, queryConfiguration, modelService);

                if (result.ContainsMatches)
                {
                    foreach (var resultEntry in result.ResultEntries)
                    {
                        if (resultEntry.Confidence < FalsePositivesThreshold || track.Equals(resultEntry.Track))
                        {
                            continue;
                        }

                        trackDuplicates.Add(resultEntry.Track);
                    }

                    if (trackDuplicates.Any())
                    {
                        HashSet <TrackData> duplicatePair = new HashSet <TrackData>(trackDuplicates)
                        {
                            track
                        };
                        duplicates.Add(duplicatePair);
                    }
                }

                callback?.Invoke(track, total, ++current);
            }

            for (int i = 0; i < duplicates.Count - 1; i++)
            {
                HashSet <TrackData> set = duplicates[i];
                for (int j = i + 1; j < duplicates.Count; j++)
                {
                    IEnumerable <TrackData> result = set.Intersect(duplicates[j]);
                    if (result.Any())
                    {
                        foreach (var track in duplicates[j])
                        {
                            // collapse all duplicates in one set
                            set.Add(track);
                        }

                        duplicates.RemoveAt(j); /*Remove the duplicate set*/
                        j--;
                    }
                }
            }

            return(duplicates.ToArray());
        }