mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
111 lines
4.1 KiB
Go
111 lines
4.1 KiB
Go
package spotify
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// AudioAnalysis contains a detailed audio analysis for a single track
|
|
// identified by its unique Spotify ID. See:
|
|
// https://developer.spotify.com/web-api/get-audio-analysis/
|
|
type AudioAnalysis struct {
|
|
Bars []Marker `json:"bars"`
|
|
Beats []Marker `json:"beats"`
|
|
Meta AnalysisMeta `json:"meta"`
|
|
Sections []Section `json:"sections"`
|
|
Segments []Segment `json:"segments"`
|
|
Tatums []Marker `json:"tatums"`
|
|
Track AnalysisTrack `json:"track"`
|
|
}
|
|
|
|
// Marker represents beats, bars, tatums and are used in segment and section
|
|
// descriptions.
|
|
type Marker struct {
|
|
Start float64 `json:"start"`
|
|
Duration float64 `json:"duration"`
|
|
Confidence float64 `json:"confidence"`
|
|
}
|
|
|
|
// AnalysisMeta describes details about Spotify's audio analysis of the track
|
|
type AnalysisMeta struct {
|
|
AnalyzerVersion string `json:"analyzer_version"`
|
|
Platform string `json:"platform"`
|
|
DetailedStatus string `json:"detailed_status"`
|
|
StatusCode int `json:"status"`
|
|
Timestamp int64 `json:"timestamp"`
|
|
AnalysisTime float64 `json:"analysis_time"`
|
|
InputProcess string `json:"input_process"`
|
|
}
|
|
|
|
// Section represents a large variation in rhythm or timbre, e.g. chorus, verse,
|
|
// bridge, guitar solo, etc. Each section contains its own descriptions of
|
|
// tempo, key, mode, time_signature, and loudness.
|
|
type Section struct {
|
|
Marker
|
|
Loudness float64 `json:"loudness"`
|
|
Tempo float64 `json:"tempo"`
|
|
TempoConfidence float64 `json:"tempo_confidence"`
|
|
Key Key `json:"key"`
|
|
KeyConfidence float64 `json:"key_confidence"`
|
|
Mode Mode `json:"mode"`
|
|
ModeConfidence float64 `json:"mode_confidence"`
|
|
TimeSignature int `json:"time_signature"`
|
|
TimeSignatureConfidence float64 `json:"time_signature_confidence"`
|
|
}
|
|
|
|
// Segment is characterized by it's perceptual onset and duration in seconds,
|
|
// loudness (dB), pitch and timbral content.
|
|
type Segment struct {
|
|
Marker
|
|
LoudnessStart float64 `json:"loudness_start"`
|
|
LoudnessMaxTime float64 `json:"loudness_max_time"`
|
|
LoudnessMax float64 `json:"loudness_max"`
|
|
LoudnessEnd float64 `json:"loudness_end"`
|
|
Pitches []float64 `json:"pitches"`
|
|
Timbre []float64 `json:"timbre"`
|
|
}
|
|
|
|
// AnalysisTrack contains audio analysis data about the track as a whole
|
|
type AnalysisTrack struct {
|
|
NumSamples int64 `json:"num_samples"`
|
|
Duration float64 `json:"duration"`
|
|
SampleMD5 string `json:"sample_md5"`
|
|
OffsetSeconds int `json:"offset_seconds"`
|
|
WindowSeconds int `json:"window_seconds"`
|
|
AnalysisSampleRate int64 `json:"analysis_sample_rate"`
|
|
AnalysisChannels int `json:"analysis_channels"`
|
|
EndOfFadeIn float64 `json:"end_of_fade_in"`
|
|
StartOfFadeOut float64 `json:"start_of_fade_out"`
|
|
Loudness float64 `json:"loudness"`
|
|
Tempo float64 `json:"tempo"`
|
|
TempoConfidence float64 `json:"tempo_confidence"`
|
|
TimeSignature int `json:"time_signature"`
|
|
TimeSignatureConfidence float64 `json:"time_signature_confidence"`
|
|
Key Key `json:"key"`
|
|
KeyConfidence float64 `json:"key_confidence"`
|
|
Mode Mode `json:"mode"`
|
|
ModeConfidence float64 `json:"mode_confidence"`
|
|
CodeString string `json:"codestring"`
|
|
CodeVersion float64 `json:"code_version"`
|
|
EchoprintString string `json:"echoprintstring"`
|
|
EchoprintVersion float64 `json:"echoprint_version"`
|
|
SynchString string `json:"synchstring"`
|
|
SynchVersion float64 `json:"synch_version"`
|
|
RhythmString string `json:"rhythmstring"`
|
|
RhythmVersion float64 `json:"rhythm_version"`
|
|
}
|
|
|
|
// GetAudioAnalysis queries the Spotify web API for an audio analysis of a
|
|
// single track.
|
|
func (c *Client) GetAudioAnalysis(id ID) (*AudioAnalysis, error) {
|
|
url := fmt.Sprintf("%saudio-analysis/%s", c.baseURL, id)
|
|
|
|
temp := AudioAnalysis{}
|
|
|
|
err := c.get(url, &temp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &temp, nil
|
|
}
|