vsd 0.5.0

A command-line utility and library for downloading streams from DASH manifests and HLS playlists.
Documentation
use crate::{playlist, utils};
use reqwest::Url;

pub fn parse_as_master(base_url: &Url, m3u8: &m3u8_rs::MasterPlaylist) -> playlist::MasterPlaylist {
    let mut streams = Vec::new();

    for stream in &m3u8.variants {
        streams.push(playlist::MediaPlaylist {
            bandwidth: Some(stream.bandwidth),
            codecs: stream.codecs.to_owned(),
            extension: Some("ts".to_owned()),
            frame_rate: stream.frame_rate.map(|x| x as f32),
            id: utils::gen_id(base_url.as_str(), &stream.uri),
            i_frame: stream.is_i_frame,
            media_type: playlist::MediaType::Video,
            playlist_type: playlist::PlaylistType::Hls,
            resolution: stream.resolution.map(|r| (r.width, r.height)),
            uri: stream.uri.to_owned(),
            ..Default::default()
        });
    }

    for alt in &m3u8.alternatives {
        let Some(uri) = &alt.uri else {
            continue;
        };

        streams.push(playlist::MediaPlaylist {
            bandwidth: alt.other_attributes.as_ref().and_then(|x| {
                x.get("BANDWIDTH")
                    .and_then(|x| x.as_str().parse::<u64>().ok())
            }),
            channels: alt.channels.as_ref().and_then(|x| x.parse::<f32>().ok()),
            codecs: alt
                .other_attributes
                .as_ref()
                .and_then(|x| x.get("CODECS").map(|x| x.as_str().to_owned())),
            extension: match alt.media_type {
                m3u8_rs::AlternativeMediaType::ClosedCaptions
                | m3u8_rs::AlternativeMediaType::Subtitles => Some("vtt".to_owned()),
                _ => Some("ts".to_owned()),
            },
            id: utils::gen_id(base_url.as_str(), uri),
            language: alt.language.clone().or(alt.assoc_language.clone()),
            media_type: match alt.media_type {
                m3u8_rs::AlternativeMediaType::Audio => playlist::MediaType::Audio,
                m3u8_rs::AlternativeMediaType::ClosedCaptions
                | m3u8_rs::AlternativeMediaType::Subtitles => playlist::MediaType::Subtitles,
                m3u8_rs::AlternativeMediaType::Other(_) => playlist::MediaType::Undefined,
                m3u8_rs::AlternativeMediaType::Video => playlist::MediaType::Video,
            },
            playlist_type: playlist::PlaylistType::Hls,
            uri: uri.to_owned(),
            ..Default::default()
        });
    }

    playlist::MasterPlaylist {
        playlist_type: playlist::PlaylistType::Hls,
        uri: base_url.to_string(),
        streams,
    }
}