use serde::{Deserialize, Serialize};
#[cfg(feature = "chrono")]
use crate::parser::parse_datetime;
#[cfg(feature = "chrono")]
use chrono::{DateTime, FixedOffset};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct IcecastStatsSource {
artist: Option<String>,
title: Option<String>,
audio_bitrate: Option<u32>,
audio_channels: Option<u8>,
audio_samplerate: Option<u32>,
frame_rate: Option<f32>,
frame_size: Option<String>,
bitrate: Option<u32>,
genre: Option<String>,
#[serde(rename = "ice-bitrate")]
ice_bitrate: Option<u32>,
#[serde(rename = "ice-samplerate")]
ice_samplerate: Option<u32>,
#[serde(rename = "ice-channels")]
ice_channels: Option<u8>,
listener_peak: Option<u32>,
listeners: Option<u32>,
listenurl: Option<String>,
server_description: Option<String>,
server_name: Option<String>,
server_type: Option<String>,
subtype: Option<String>,
stream_start_iso8601: Option<String>,
stream_start: Option<String>,
total_bytes_read: Option<u32>,
total_bytes_sent: Option<u32>,
user_agent: Option<String>,
video_bitrate: Option<u32>,
video_quality: Option<u32>,
}
impl IcecastStatsSource {
pub fn artist(&self) -> Option<&String> {
self.artist.as_ref()
}
pub fn title(&self) -> Option<&String> {
self.title.as_ref()
}
pub fn audio_bitrate(&self) -> &Option<u32> {
&self.audio_bitrate
}
pub fn audio_channels(&self) -> &Option<u8> {
&self.audio_channels
}
pub fn audio_samplerate(&self) -> &Option<u32> {
&self.audio_samplerate
}
pub fn audio_bitrate_source(&self) -> &Option<u32> {
&self.ice_bitrate
}
pub fn audio_channels_source(&self) -> &Option<u8> {
&self.ice_channels
}
pub fn audio_samplerate_source(&self) -> &Option<u32> {
&self.ice_samplerate
}
pub fn frame_rate(&self) -> &Option<f32> {
&self.frame_rate
}
pub fn frame_size(&self) -> Option<&String> {
self.frame_size.as_ref()
}
pub fn bitrate(&self) -> &Option<u32> {
&self.bitrate
}
pub fn genre(&self) -> Option<&String> {
self.genre.as_ref()
}
pub fn ice_bitrate(&self) -> &Option<u32> {
&self.ice_bitrate
}
pub fn listener_peak(&self) -> &Option<u32> {
&self.listener_peak
}
pub fn listeners(&self) -> &Option<u32> {
&self.listeners
}
pub fn listenurl(&self) -> Option<&String> {
self.listenurl.as_ref()
}
pub fn server_description(&self) -> Option<&String> {
self.server_description.as_ref()
}
pub fn server_name(&self) -> Option<&String> {
self.server_name.as_ref()
}
pub fn server_type(&self) -> Option<&String> {
self.server_type.as_ref()
}
pub fn subtype(&self) -> Option<&String> {
self.subtype.as_ref()
}
pub fn stream_start(&self) -> Option<&String> {
if self.stream_start_iso8601.is_some() {
return self.stream_start_iso8601.as_ref();
}
self.stream_start.as_ref()
}
#[cfg(feature = "chrono")]
pub fn stream_start_decoded(
&self,
) -> Option<Result<DateTime<FixedOffset>, chrono::ParseError>> {
self.stream_start().clone().map(|x| parse_datetime(&x))
}
pub fn user_agent(&self) -> Option<&String> {
self.user_agent.as_ref()
}
pub fn video_bitrate(&self) -> Option<u32> {
self.video_bitrate
}
pub fn video_quality(&self) -> &Option<u32> {
&self.video_quality
}
pub fn generate_name(&self) -> String {
let mut result = String::new();
if let Some(server_name) = self.server_name() {
result.push_str(&server_name);
}
if let Some(title) = self.title() {
result.push_str(&format!(" / {}", title));
}
if let Some(bitrate) = self.bitrate() {
result.push_str(&format!(" / {} kBit", bitrate));
}
result
}
}