1use serde::{Deserialize, Serialize};
4
5use chrono::Duration;
6
7use crate::{
8 custom_serde::{duration_ms, modality},
9 Modality, TrackId,
10};
11
12#[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#[derive(Deserialize)]
37pub struct AudioFeaturesPayload {
38 pub audio_features: Vec<Option<AudioFeatures>>,
39}
40
41#[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#[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#[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#[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#[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#[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}