mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
432 lines
18 KiB
Go
432 lines
18 KiB
Go
package spotify
|
||
|
||
// TrackAttributes contains various tuneable parameters that can be used for recommendations.
|
||
// For each of the tuneable track attributes, target, min and max values may be provided.
|
||
// Target:
|
||
// Tracks with the attribute values nearest to the target values will be preferred.
|
||
// For example, you might request TargetEnergy=0.6 and TargetDanceability=0.8.
|
||
// All target values will be weighed equally in ranking results.
|
||
// Max:
|
||
// A hard ceiling on the selected track attribute’s value can be provided.
|
||
// For example, MaxInstrumentalness=0.35 would filter out most tracks
|
||
// that are likely to be instrumental.
|
||
// Min:
|
||
// A hard floor on the selected track attribute’s value can be provided.
|
||
// For example, min_tempo=140 would restrict results to only those tracks
|
||
// with a tempo of greater than 140 beats per minute.
|
||
type TrackAttributes struct {
|
||
intAttributes map[string]int
|
||
floatAttributes map[string]float64
|
||
}
|
||
|
||
// NewTrackAttributes returns a new TrackAttributes instance with no attributes set.
|
||
// Attributes can then be chained following a builder pattern:
|
||
// ta := NewTrackAttributes().
|
||
// MaxAcousticness(0.15).
|
||
// TargetPopularity(90)
|
||
func NewTrackAttributes() *TrackAttributes {
|
||
return &TrackAttributes{
|
||
intAttributes: map[string]int{},
|
||
floatAttributes: map[string]float64{},
|
||
}
|
||
}
|
||
|
||
// MaxAcousticness sets the maximum acousticness
|
||
// Acousticness is a confidence measure from 0.0 to 1.0 of whether
|
||
// the track is acoustic. A value of 1.0 represents high confidence
|
||
// that the track is acoustic.
|
||
func (ta *TrackAttributes) MaxAcousticness(acousticness float64) *TrackAttributes {
|
||
ta.floatAttributes["max_acousticness"] = acousticness
|
||
return ta
|
||
}
|
||
|
||
// MinAcousticness sets the minimum acousticness
|
||
// Acousticness is a confidence measure from 0.0 to 1.0 of whether
|
||
// the track is acoustic. A value of 1.0 represents high confidence
|
||
// that the track is acoustic.
|
||
func (ta *TrackAttributes) MinAcousticness(acousticness float64) *TrackAttributes {
|
||
ta.floatAttributes["min_acousticness"] = acousticness
|
||
return ta
|
||
}
|
||
|
||
// TargetAcousticness sets the target acousticness
|
||
// Acousticness is a confidence measure from 0.0 to 1.0 of whether
|
||
// the track is acoustic. A value of 1.0 represents high confidence
|
||
// that the track is acoustic.
|
||
func (ta *TrackAttributes) TargetAcousticness(acousticness float64) *TrackAttributes {
|
||
ta.floatAttributes["target_acousticness"] = acousticness
|
||
return ta
|
||
}
|
||
|
||
// MaxDanceability sets the maximum danceability
|
||
// Danceability describes how suitable a track is for dancing based on
|
||
// a combination of musical elements including tempo, rhythm stability,
|
||
// beat strength, and overall regularity.
|
||
// A value of 0.0 is least danceable and 1.0 is most danceable.
|
||
func (ta *TrackAttributes) MaxDanceability(danceability float64) *TrackAttributes {
|
||
ta.floatAttributes["max_danceability"] = danceability
|
||
return ta
|
||
}
|
||
|
||
// MinDanceability sets the minimum danceability
|
||
// Danceability describes how suitable a track is for dancing based on
|
||
// a combination of musical elements including tempo, rhythm stability,
|
||
// beat strength, and overall regularity.
|
||
// A value of 0.0 is least danceable and 1.0 is most danceable.
|
||
func (ta *TrackAttributes) MinDanceability(danceability float64) *TrackAttributes {
|
||
ta.floatAttributes["min_danceability"] = danceability
|
||
return ta
|
||
}
|
||
|
||
// TargetDanceability sets the target danceability
|
||
// Danceability describes how suitable a track is for dancing based on
|
||
// a combination of musical elements including tempo, rhythm stability,
|
||
// beat strength, and overall regularity.
|
||
// A value of 0.0 is least danceable and 1.0 is most danceable.
|
||
func (ta *TrackAttributes) TargetDanceability(danceability float64) *TrackAttributes {
|
||
ta.floatAttributes["target_danceability"] = danceability
|
||
return ta
|
||
}
|
||
|
||
// MaxDuration sets the maximum length of the track in milliseconds
|
||
func (ta *TrackAttributes) MaxDuration(duration int) *TrackAttributes {
|
||
ta.intAttributes["max_duration_ms"] = duration
|
||
return ta
|
||
}
|
||
|
||
// MinDuration sets the minimum length of the track in milliseconds
|
||
func (ta *TrackAttributes) MinDuration(duration int) *TrackAttributes {
|
||
ta.intAttributes["min_duration_ms"] = duration
|
||
return ta
|
||
}
|
||
|
||
// TargetDuration sets the target length of the track in milliseconds
|
||
func (ta *TrackAttributes) TargetDuration(duration int) *TrackAttributes {
|
||
ta.intAttributes["target_duration_ms"] = duration
|
||
return ta
|
||
}
|
||
|
||
// MaxEnergy sets the maximum energy
|
||
// Energy is a measure from 0.0 to 1.0 and represents a perceptual mesaure
|
||
// of intensity and activity. Typically, energetic tracks feel fast, loud,
|
||
// and noisy.
|
||
func (ta *TrackAttributes) MaxEnergy(energy float64) *TrackAttributes {
|
||
ta.floatAttributes["max_energy"] = energy
|
||
return ta
|
||
}
|
||
|
||
// MinEnergy sets the minimum energy
|
||
// Energy is a measure from 0.0 to 1.0 and represents a perceptual mesaure
|
||
// of intensity and activity. Typically, energetic tracks feel fast, loud,
|
||
// and noisy.
|
||
func (ta *TrackAttributes) MinEnergy(energy float64) *TrackAttributes {
|
||
ta.floatAttributes["min_energy"] = energy
|
||
return ta
|
||
}
|
||
|
||
// TargetEnergy sets the target energy
|
||
// Energy is a measure from 0.0 to 1.0 and represents a perceptual mesaure
|
||
// of intensity and activity. Typically, energetic tracks feel fast, loud,
|
||
// and noisy.
|
||
func (ta *TrackAttributes) TargetEnergy(energy float64) *TrackAttributes {
|
||
ta.floatAttributes["target_energy"] = energy
|
||
return ta
|
||
}
|
||
|
||
// MaxInstrumentalness sets the maximum instrumentalness
|
||
// Instrumentalness predicts whether a track contains no vocals.
|
||
// "Ooh" and "aah" sounds are treated as instrumental in this context.
|
||
// Rap or spoken word tracks are clearly "vocal".
|
||
// The closer the instrumentalness value is to 1.0,
|
||
// the greater likelihood the track contains no vocal content.
|
||
// Values above 0.5 are intended to represent instrumental tracks,
|
||
// but confidence is higher as the value approaches 1.0.
|
||
func (ta *TrackAttributes) MaxInstrumentalness(instrumentalness float64) *TrackAttributes {
|
||
ta.floatAttributes["max_instrumentalness"] = instrumentalness
|
||
return ta
|
||
|
||
}
|
||
|
||
// MinInstrumentalness sets the minimum instrumentalness
|
||
// Instrumentalness predicts whether a track contains no vocals.
|
||
// "Ooh" and "aah" sounds are treated as instrumental in this context.
|
||
// Rap or spoken word tracks are clearly "vocal".
|
||
// The closer the instrumentalness value is to 1.0,
|
||
// the greater likelihood the track contains no vocal content.
|
||
// Values above 0.5 are intended to represent instrumental tracks,
|
||
// but confidence is higher as the value approaches 1.0.
|
||
func (ta *TrackAttributes) MinInstrumentalness(instrumentalness float64) *TrackAttributes {
|
||
ta.floatAttributes["min_instrumentalness"] = instrumentalness
|
||
return ta
|
||
|
||
}
|
||
|
||
// TargetInstrumentalness sets the target instrumentalness
|
||
// Instrumentalness predicts whether a track contains no vocals.
|
||
// "Ooh" and "aah" sounds are treated as instrumental in this context.
|
||
// Rap or spoken word tracks are clearly "vocal".
|
||
// The closer the instrumentalness value is to 1.0,
|
||
// the greater likelihood the track contains no vocal content.
|
||
// Values above 0.5 are intended to represent instrumental tracks,
|
||
// but confidence is higher as the value approaches 1.0.
|
||
func (ta *TrackAttributes) TargetInstrumentalness(instrumentalness float64) *TrackAttributes {
|
||
ta.floatAttributes["target_instrumentalness"] = instrumentalness
|
||
return ta
|
||
|
||
}
|
||
|
||
// MaxKey sets the maximum key
|
||
// Integers map to pitches using standard Pitch Class notation
|
||
// (https://en.wikipedia.org/wiki/Pitch_class).
|
||
func (ta *TrackAttributes) MaxKey(key int) *TrackAttributes {
|
||
ta.intAttributes["max_key"] = key
|
||
return ta
|
||
}
|
||
|
||
// MinKey sets the minimum key
|
||
// Integers map to pitches using standard Pitch Class notation
|
||
// (https://en.wikipedia.org/wiki/Pitch_class).
|
||
func (ta *TrackAttributes) MinKey(key int) *TrackAttributes {
|
||
ta.intAttributes["min_key"] = key
|
||
return ta
|
||
}
|
||
|
||
// TargetKey sets the target key
|
||
// Integers map to pitches using standard Pitch Class notation
|
||
// (https://en.wikipedia.org/wiki/Pitch_class).
|
||
func (ta *TrackAttributes) TargetKey(key int) *TrackAttributes {
|
||
ta.intAttributes["target_key"] = key
|
||
return ta
|
||
}
|
||
|
||
// MaxLiveness sets the maximum liveness
|
||
// Detects the presence of an audience in the recording. Higher liveness
|
||
// values represent an increased probability that the track was performed live.
|
||
// A value above 0.8 provides strong likelihook that the track is live.
|
||
func (ta *TrackAttributes) MaxLiveness(liveness float64) *TrackAttributes {
|
||
ta.floatAttributes["max_liveness"] = liveness
|
||
return ta
|
||
}
|
||
|
||
// MinLiveness sets the minimum liveness
|
||
// Detects the presence of an audience in the recording. Higher liveness
|
||
// values represent an increased probability that the track was performed live.
|
||
// A value above 0.8 provides strong likelihook that the track is live.
|
||
func (ta *TrackAttributes) MinLiveness(liveness float64) *TrackAttributes {
|
||
ta.floatAttributes["min_liveness"] = liveness
|
||
return ta
|
||
}
|
||
|
||
// TargetLiveness sets the target liveness
|
||
// Detects the presence of an audience in the recording. Higher liveness
|
||
// values represent an increased probability that the track was performed live.
|
||
// A value above 0.8 provides strong likelihook that the track is live.
|
||
func (ta *TrackAttributes) TargetLiveness(liveness float64) *TrackAttributes {
|
||
ta.floatAttributes["target_liveness"] = liveness
|
||
return ta
|
||
}
|
||
|
||
// MaxLoudness sets the maximum loudness in decibels (dB)
|
||
// Loudness values are averaged across the entire track and are
|
||
// useful for comparing the relative loudness of tracks.
|
||
// Typical values range between -60 and 0 dB.
|
||
func (ta *TrackAttributes) MaxLoudness(loudness float64) *TrackAttributes {
|
||
ta.floatAttributes["max_loudness"] = loudness
|
||
return ta
|
||
}
|
||
|
||
// MinLoudness sets the minimum loudness in decibels (dB)
|
||
// Loudness values are averaged across the entire track and are
|
||
// useful for comparing the relative loudness of tracks.
|
||
// Typical values range between -60 and 0 dB.
|
||
func (ta *TrackAttributes) MinLoudness(loudness float64) *TrackAttributes {
|
||
ta.floatAttributes["min_loudness"] = loudness
|
||
return ta
|
||
}
|
||
|
||
// TargetLoudness sets the target loudness in decibels (dB)
|
||
// Loudness values are averaged across the entire track and are
|
||
// useful for comparing the relative loudness of tracks.
|
||
// Typical values range between -60 and 0 dB.
|
||
func (ta *TrackAttributes) TargetLoudness(loudness float64) *TrackAttributes {
|
||
ta.floatAttributes["target_loudness"] = loudness
|
||
return ta
|
||
}
|
||
|
||
// MaxMode sets the maximum mode
|
||
// Mode indicates the modality (major or minor) of a track.
|
||
func (ta *TrackAttributes) MaxMode(mode int) *TrackAttributes {
|
||
ta.intAttributes["max_mode"] = mode
|
||
return ta
|
||
}
|
||
|
||
// MinMode sets the minimum mode
|
||
// Mode indicates the modality (major or minor) of a track.
|
||
func (ta *TrackAttributes) MinMode(mode int) *TrackAttributes {
|
||
ta.intAttributes["min_mode"] = mode
|
||
return ta
|
||
}
|
||
|
||
// TargetMode sets the target mode
|
||
// Mode indicates the modality (major or minor) of a track.
|
||
func (ta *TrackAttributes) TargetMode(mode int) *TrackAttributes {
|
||
ta.intAttributes["target_mode"] = mode
|
||
return ta
|
||
}
|
||
|
||
// MaxPopularity sets the maximum popularity.
|
||
// The value will be between 0 and 100, with 100 being the most popular.
|
||
// The popularity is calculated by algorithm and is based, in the most part,
|
||
// on the total number of plays the track has had and how recent those plays are.
|
||
// Note: When applying track relinking via the market parameter, it is expected to find
|
||
// relinked tracks with popularities that do not match min_*, max_* and target_* popularities.
|
||
// These relinked tracks are accurate replacements for unplayable tracks
|
||
// with the expected popularity scores. Original, non-relinked tracks are
|
||
// available via the linked_from attribute of the relinked track response.
|
||
func (ta *TrackAttributes) MaxPopularity(popularity int) *TrackAttributes {
|
||
ta.intAttributes["max_popularity"] = popularity
|
||
return ta
|
||
}
|
||
|
||
// MinPopularity sets the minimum popularity.
|
||
// The value will be between 0 and 100, with 100 being the most popular.
|
||
// The popularity is calculated by algorithm and is based, in the most part,
|
||
// on the total number of plays the track has had and how recent those plays are.
|
||
// Note: When applying track relinking via the market parameter, it is expected to find
|
||
// relinked tracks with popularities that do not match min_*, max_* and target_* popularities.
|
||
// These relinked tracks are accurate replacements for unplayable tracks
|
||
// with the expected popularity scores. Original, non-relinked tracks are
|
||
// available via the linked_from attribute of the relinked track response.
|
||
func (ta *TrackAttributes) MinPopularity(popularity int) *TrackAttributes {
|
||
ta.intAttributes["min_popularity"] = popularity
|
||
return ta
|
||
}
|
||
|
||
// TargetPopularity sets the target popularity.
|
||
// The value will be between 0 and 100, with 100 being the most popular.
|
||
// The popularity is calculated by algorithm and is based, in the most part,
|
||
// on the total number of plays the track has had and how recent those plays are.
|
||
// Note: When applying track relinking via the market parameter, it is expected to find
|
||
// relinked tracks with popularities that do not match min_*, max_* and target_* popularities.
|
||
// These relinked tracks are accurate replacements for unplayable tracks
|
||
// with the expected popularity scores. Original, non-relinked tracks are
|
||
// available via the linked_from attribute of the relinked track response.
|
||
func (ta *TrackAttributes) TargetPopularity(popularity int) *TrackAttributes {
|
||
ta.intAttributes["target_popularity"] = popularity
|
||
return ta
|
||
}
|
||
|
||
// MaxSpeechiness sets the maximum speechiness.
|
||
// Speechiness detects the presence of spoken words in a track.
|
||
// The more exclusively speech-like the recording, the closer to 1.0
|
||
// the speechiness will be.
|
||
// Values above 0.66 describe tracks that are probably made entirely of
|
||
// spoken words. Values between 0.33 and 0.66 describe tracks that may
|
||
// contain both music and speech, including such cases as rap music.
|
||
// Values below 0.33 most likely represent music and other non-speech-like tracks.
|
||
func (ta *TrackAttributes) MaxSpeechiness(speechiness float64) *TrackAttributes {
|
||
ta.floatAttributes["max_speechiness"] = speechiness
|
||
return ta
|
||
|
||
}
|
||
|
||
// MinSpeechiness sets the minimum speechiness.
|
||
// Speechiness detects the presence of spoken words in a track.
|
||
// The more exclusively speech-like the recording, the closer to 1.0
|
||
// the speechiness will be.
|
||
// Values above 0.66 describe tracks that are probably made entirely of
|
||
// spoken words. Values between 0.33 and 0.66 describe tracks that may
|
||
// contain both music and speech, including such cases as rap music.
|
||
// Values below 0.33 most likely represent music and other non-speech-like tracks.
|
||
func (ta *TrackAttributes) MinSpeechiness(speechiness float64) *TrackAttributes {
|
||
ta.floatAttributes["min_speechiness"] = speechiness
|
||
return ta
|
||
|
||
}
|
||
|
||
// TargetSpeechiness sets the target speechiness.
|
||
// Speechiness detects the presence of spoken words in a track.
|
||
// The more exclusively speech-like the recording, the closer to 1.0
|
||
// the speechiness will be.
|
||
// Values above 0.66 describe tracks that are probably made entirely of
|
||
// spoken words. Values between 0.33 and 0.66 describe tracks that may
|
||
// contain both music and speech, including such cases as rap music.
|
||
// Values below 0.33 most likely represent music and other non-speech-like tracks.
|
||
func (ta *TrackAttributes) TargetSpeechiness(speechiness float64) *TrackAttributes {
|
||
ta.floatAttributes["target_speechiness"] = speechiness
|
||
return ta
|
||
}
|
||
|
||
// MaxTempo sets the maximum tempo in beats per minute (BPM).
|
||
func (ta *TrackAttributes) MaxTempo(tempo float64) *TrackAttributes {
|
||
ta.floatAttributes["max_tempo"] = tempo
|
||
return ta
|
||
}
|
||
|
||
// MinTempo sets the minimum tempo in beats per minute (BPM).
|
||
func (ta *TrackAttributes) MinTempo(tempo float64) *TrackAttributes {
|
||
ta.floatAttributes["min_tempo"] = tempo
|
||
return ta
|
||
}
|
||
|
||
// TargetTempo sets the target tempo in beats per minute (BPM).
|
||
func (ta *TrackAttributes) TargetTempo(tempo float64) *TrackAttributes {
|
||
ta.floatAttributes["target_tempo"] = tempo
|
||
return ta
|
||
|
||
}
|
||
|
||
// MaxTimeSignature sets the maximum time signature
|
||
// The time signature (meter) is a notational convention to
|
||
// specify how many beats are in each bar (or measure).
|
||
func (ta *TrackAttributes) MaxTimeSignature(timeSignature int) *TrackAttributes {
|
||
ta.intAttributes["max_time_signature"] = timeSignature
|
||
return ta
|
||
}
|
||
|
||
// MinTimeSignature sets the minimum time signature
|
||
// The time signature (meter) is a notational convention to
|
||
// specify how many beats are in each bar (or measure).
|
||
func (ta *TrackAttributes) MinTimeSignature(timeSignature int) *TrackAttributes {
|
||
ta.intAttributes["min_time_signature"] = timeSignature
|
||
return ta
|
||
}
|
||
|
||
// TargetTimeSignature sets the target time signature
|
||
// The time signature (meter) is a notational convention to
|
||
// specify how many beats are in each bar (or measure).
|
||
func (ta *TrackAttributes) TargetTimeSignature(timeSignature int) *TrackAttributes {
|
||
ta.intAttributes["target_time_signature"] = timeSignature
|
||
return ta
|
||
}
|
||
|
||
// MaxValence sets the maximum valence.
|
||
// Valence is a measure from 0.0 to 1.0 describing the musical positiveness
|
||
/// conveyed by a track.
|
||
// Tracks with high valence sound more positive (e.g. happy, cheerful, euphoric),
|
||
// while tracks with low valence sound more negative (e.g. sad, depressed, angry).
|
||
func (ta *TrackAttributes) MaxValence(valence float64) *TrackAttributes {
|
||
ta.floatAttributes["max_valence"] = valence
|
||
return ta
|
||
}
|
||
|
||
// MinValence sets the minimum valence.
|
||
// Valence is a measure from 0.0 to 1.0 describing the musical positiveness
|
||
/// conveyed by a track.
|
||
// Tracks with high valence sound more positive (e.g. happy, cheerful, euphoric),
|
||
// while tracks with low valence sound more negative (e.g. sad, depressed, angry).
|
||
func (ta *TrackAttributes) MinValence(valence float64) *TrackAttributes {
|
||
ta.floatAttributes["min_valence"] = valence
|
||
return ta
|
||
}
|
||
|
||
// TargetValence sets the target valence.
|
||
// Valence is a measure from 0.0 to 1.0 describing the musical positiveness
|
||
/// conveyed by a track.
|
||
// Tracks with high valence sound more positive (e.g. happy, cheerful, euphoric),
|
||
// while tracks with low valence sound more negative (e.g. sad, depressed, angry).
|
||
func (ta *TrackAttributes) TargetValence(valence float64) *TrackAttributes {
|
||
ta.floatAttributes["target_valence"] = valence
|
||
return ta
|
||
}
|