rspotify_model/
audio.rs

1//! All objects related to audio defined by Spotify API
2
3use serde::{Deserialize, Serialize};
4
5use chrono::Duration;
6
7use crate::{
8    custom_serde::{duration_ms, modality},
9    Modality, TrackId,
10};
11
12/// Audio Feature Object
13#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
14pub struct AudioFeatures {
15    pub acousticness: f32,
16    pub analysis_url: String,
17    pub danceability: f32,
18    #[serde(with = "duration_ms", rename = "duration_ms")]
19    pub duration: Duration,
20    pub energy: f32,
21    pub id: TrackId<'static>,
22    pub instrumentalness: f32,
23    pub key: i32,
24    pub liveness: f32,
25    pub loudness: f32,
26    #[serde(with = "modality")]
27    pub mode: Modality,
28    pub speechiness: f32,
29    pub tempo: f32,
30    pub time_signature: i32,
31    pub track_href: String,
32    pub valence: f32,
33}
34
35/// Intermediate audio feature object wrapped by `Vec`
36#[derive(Deserialize)]
37pub struct AudioFeaturesPayload {
38    pub audio_features: Vec<Option<AudioFeatures>>,
39}
40
41/// Audio analysis object
42#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
43pub struct AudioAnalysis {
44    pub bars: Vec<TimeInterval>,
45    pub beats: Vec<TimeInterval>,
46    pub meta: AudioAnalysisMeta,
47    pub sections: Vec<AudioAnalysisSection>,
48    pub segments: Vec<AudioAnalysisSegment>,
49    pub tatums: Vec<TimeInterval>,
50    pub track: AudioAnalysisTrack,
51}
52
53/// Time interval object
54#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
55pub struct TimeInterval {
56    pub start: f32,
57    pub duration: f32,
58    pub confidence: f32,
59}
60
61/// Audio analysis section object
62#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
63pub struct AudioAnalysisSection {
64    #[serde(flatten)]
65    pub time_interval: TimeInterval,
66    pub loudness: f32,
67    pub tempo: f32,
68    pub tempo_confidence: f32,
69    pub key: i32,
70    pub key_confidence: f32,
71    #[serde(with = "modality")]
72    pub mode: Modality,
73    pub mode_confidence: f32,
74    pub time_signature: i32,
75    pub time_signature_confidence: f32,
76}
77
78/// Audio analysis meta object
79#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
80pub struct AudioAnalysisMeta {
81    pub analyzer_version: String,
82    pub platform: String,
83    pub detailed_status: String,
84    pub status_code: i32,
85    pub timestamp: u64,
86    pub analysis_time: f32,
87    pub input_process: String,
88}
89
90/// Audio analysis segment object
91#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
92pub struct AudioAnalysisSegment {
93    #[serde(flatten)]
94    pub time_interval: TimeInterval,
95    pub loudness_start: f32,
96    pub loudness_max_time: f32,
97    pub loudness_max: f32,
98    pub loudness_end: Option<f32>,
99    pub pitches: Vec<f32>,
100    pub timbre: Vec<f32>,
101}
102
103/// Audio analysis track object
104#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
105pub struct AudioAnalysisTrack {
106    pub num_samples: u32,
107    pub duration: f32,
108    pub sample_md5: String,
109    pub offset_seconds: u32,
110    pub window_seconds: u32,
111    pub analysis_sample_rate: i32,
112    pub analysis_channels: u32,
113    pub end_of_fade_in: f32,
114    pub start_of_fade_out: f32,
115    pub loudness: f32,
116    pub tempo: f32,
117    pub tempo_confidence: f32,
118    pub time_signature: i32,
119    pub time_signature_confidence: f32,
120    pub key: u32,
121    pub key_confidence: f32,
122    #[serde(with = "modality")]
123    pub mode: Modality,
124    pub mode_confidence: f32,
125    pub codestring: String,
126    pub code_version: f32,
127    pub echoprintstring: String,
128    pub echoprint_version: f32,
129    pub synchstring: String,
130    pub synch_version: f32,
131    pub rhythmstring: String,
132    pub rhythm_version: f32,
133}