From 765c7011c257b541816be1a4ec1e6c45d3b8b065 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 5 Aug 2026 22:31:06 -0700 Subject: [PATCH] Calculate audio bitrate --- src/audio.rs | 60 ++++++++++++++++++++++++++--- src/audio_error.rs | 2 + src/audio_metadata.rs | 1 + src/display_bitrate.rs | 21 ++++++++-- src/flac_decoder.rs | 72 ++++++++++++++++++++++++++++------- src/metadata.rs | 1 + src/mp3_decoder.rs | 25 ++++++++---- src/subcommand/serve/tests.rs | 2 + src/templates/audio.rs | 1 + src/templates/package.rs | 6 +++ src/test.rs | 2 + src/track.rs | 18 +-------- tests/metadata.rs | 3 ++ 13 files changed, 169 insertions(+), 45 deletions(-) diff --git a/src/audio.rs b/src/audio.rs index 222f0638..788bb4ca 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -22,12 +22,14 @@ pub(crate) struct Audio { #[n(8)] pub(crate) samples: u64, #[n(9)] - pub(crate) title: Text, + pub(crate) size: u64, #[n(10)] - pub(crate) track: u64, + pub(crate) title: Text, #[n(11)] - pub(crate) tracks: u64, + pub(crate) track: u64, #[n(12)] + pub(crate) tracks: u64, + #[n(13)] #[serde(rename = "type")] pub(crate) ty: AudioType, } @@ -162,6 +164,7 @@ impl Audio { sample_bits, sample_rate, samples, + size, title, track, tracks, @@ -175,6 +178,7 @@ impl Audio { self.sample_bits = sample_bits; self.sample_rate = sample_rate; self.samples = samples; + self.size = size; self.title = title; self.track = track; self.tracks = tracks; @@ -234,6 +238,7 @@ impl FromStr for Audio { sample_bits: None, sample_rate: 0, samples: 0, + size: 0, title: Text::new(), track: 0, tracks: 0, @@ -260,6 +265,13 @@ impl Item for Audio { .map(|sample_bits| format!("{sample_bits}-bit")), ) .value("sample rate", DisplaySampleRate(self.sample_rate)) + .optional( + "bit rate", + DisplayBitrate::new( + u64::try_from(self.duration().as_millis()).unwrap_or(u64::MAX), + self.size, + ), + ) .value("channels", self.channels) .value( "compression mode", @@ -470,6 +482,7 @@ mod tests { sample_bits: None, sample_rate: 0, samples: 0, + size: 0, title: Text::new(), track: 0, tracks: 0, @@ -489,6 +502,7 @@ mod tests { sample_bits: None, sample_rate: 0, samples: 0, + size: 0, title: Text::new(), track: 0, tracks: 0, @@ -523,6 +537,7 @@ mod tests { audio.sample_bits = Some(16); audio.sample_rate = 44100; audio.samples = 66150; + audio.size = 750; audio.title = "bar".parse().unwrap(); audio.track = 3; audio.tracks = 4; @@ -546,6 +561,7 @@ mod tests { ("type".into(), Info::Value("FLAC".into())), ("sample bits".into(), Info::Value("16-bit".into())), ("sample rate".into(), Info::Value("44.1 kHz".into())), + ("bit rate".into(), Info::Value("4 kbit/s".into())), ("channels".into(), Info::Value("2".into())), ("compression mode".into(), Info::Value("lossless".into())), ("samples".into(), Info::Value("66150".into())), @@ -560,6 +576,7 @@ mod tests { audio.discs = 2; audio.sample_rate = 44100; audio.samples = 66150; + audio.size = 750; audio.title = "bar".parse().unwrap(); audio.track = 3; audio.tracks = 4; @@ -582,11 +599,39 @@ mod tests { ("duration".into(), Info::Value("0:01".into())), ("type".into(), Info::Value("MP3".into())), ("sample rate".into(), Info::Value("44.1 kHz".into())), + ("bit rate".into(), Info::Value("4 kbit/s".into())), ("channels".into(), Info::Value("2".into())), ("compression mode".into(), Info::Value("lossy".into())), ("samples".into(), Info::Value("66150".into())), ]), ); + + let mut audio = "foo.flac".parse::