diff --git a/server/shazam/fingerprint.go b/server/shazam/fingerprint.go index a29398b..1dd3d51 100644 --- a/server/shazam/fingerprint.go +++ b/server/shazam/fingerprint.go @@ -1,7 +1,10 @@ package shazam import ( + "fmt" "song-recognition/models" + "song-recognition/utils" + "song-recognition/wav" ) const ( @@ -44,3 +47,37 @@ func createAddress(anchor, target Peak) uint32 { return address } + +func FingerprintAudio(songFilePath string, songID uint32) (map[uint32]models.Couple, error) { + wavFilePath, err := wav.ConvertToWAV(songFilePath) + if err != nil { + return nil, fmt.Errorf("error converting input file to WAV: %v", err) + } + + wavInfo, err := wav.ReadWavInfo(wavFilePath) + if err != nil { + return nil, fmt.Errorf("error reading WAV info: %v", err) + } + + fingerprint := make(map[uint32]models.Couple) + + spectro, err := Spectrogram(wavInfo.LeftChannelSamples, wavInfo.SampleRate) + if err != nil { + return nil, fmt.Errorf("error creating spectrogram: %v", err) + } + + peaks := ExtractPeaks(spectro, wavInfo.Duration) + utils.ExtendMap(fingerprint, Fingerprint(peaks, songID)) + + if wavInfo.Channels == 2 { + spectro, err = Spectrogram(wavInfo.RightChannelSamples, wavInfo.SampleRate) + if err != nil { + return nil, fmt.Errorf("error creating spectrogram for right channel: %v", err) + } + + peaks = ExtractPeaks(spectro, wavInfo.Duration) + utils.ExtendMap(fingerprint, Fingerprint(peaks, songID)) + } + + return fingerprint, nil +}