riva 0.1.0

Provider-agnostic Rust library for extracting normalized media stream metadata from SoundCloud and YouTube via async helpers.
Documentation
use serde::Deserialize;

#[derive(Debug, Clone)]
pub struct StreamInfo {
    pub url: String,
    pub protocol: String,
    pub mime_type: String,
    pub quality: Option<String>,
    pub preset: Option<String>,
    pub duration_ms: Option<u64>,
    pub snipped: bool,
    pub artwork_url: Option<String>,
}

#[derive(Debug, Deserialize)]
pub struct Track {
    pub kind: Option<String>,
    pub media: Option<MediaCollection>,
    pub track_authorization: Option<String>,
    #[serde(default)]
    pub artwork_url: Option<String>,
}

#[derive(Debug, Deserialize)]
pub struct MediaCollection {
    #[serde(default)]
    pub transcodings: Vec<Transcoding>,
}

#[derive(Debug, Deserialize)]
pub struct Transcoding {
    pub url: String,
    pub preset: Option<String>,
    pub quality: Option<String>,
    pub snipped: Option<bool>,
    pub format: Option<TranscodingFormat>,
    pub duration: Option<u64>,
}

impl Transcoding {
    pub fn into_stream_info(
        self,
        resolved_url: String,
        artwork_url: Option<&str>,
    ) -> Option<StreamInfo> {
        let format = self.format?;
        Some(StreamInfo {
            url: resolved_url,
            protocol: format.protocol,
            mime_type: format.mime_type,
            quality: self.quality,
            preset: self.preset,
            duration_ms: self.duration,
            snipped: self.snipped.unwrap_or(false),
            artwork_url: artwork_url.map(|value| value.to_string()),
        })
    }
}

#[derive(Debug, Deserialize)]
pub struct TranscodingFormat {
    pub protocol: String,
    pub mime_type: String,
}

#[derive(Debug, Deserialize)]
pub struct TranscodingLocation {
    pub url: String,
}