use crate::hls::{MasterPlaylist, MediaPlaylist, Segment, StreamInf, VariantStream};
use std::time::Duration;
pub struct MasterPlaylistBuilder {
playlist: MasterPlaylist,
}
impl MasterPlaylistBuilder {
#[must_use]
pub fn new() -> Self {
Self {
playlist: MasterPlaylist::new(),
}
}
#[must_use]
pub fn version(mut self, version: u8) -> Self {
self.playlist.version = version;
self
}
#[must_use]
pub fn independent_segments(mut self) -> Self {
self.playlist.independent_segments = true;
self
}
#[must_use]
pub fn add_variant(
mut self,
bandwidth: u64,
resolution: (u32, u32),
codecs: impl Into<String>,
uri: impl Into<String>,
) -> Self {
let stream_inf = StreamInf {
bandwidth,
average_bandwidth: Some(bandwidth),
codecs: Some(codecs.into()),
resolution: Some(resolution),
frame_rate: Some(30.0),
hdcp_level: None,
audio: None,
video: None,
subtitles: None,
closed_captions: None,
};
self.playlist.variants.push(VariantStream {
stream_inf,
uri: uri.into(),
});
self
}
#[must_use]
pub fn build(self) -> MasterPlaylist {
self.playlist
}
}
impl Default for MasterPlaylistBuilder {
fn default() -> Self {
Self::new()
}
}
pub struct MediaPlaylistBuilder {
playlist: MediaPlaylist,
}
impl MediaPlaylistBuilder {
#[must_use]
pub fn new() -> Self {
Self {
playlist: MediaPlaylist::new(),
}
}
#[must_use]
pub fn version(mut self, version: u8) -> Self {
self.playlist.version = version;
self
}
#[must_use]
pub fn target_duration(mut self, duration: u64) -> Self {
self.playlist.target_duration = duration;
self
}
#[must_use]
pub fn media_sequence(mut self, sequence: u64) -> Self {
self.playlist.media_sequence = sequence;
self
}
#[must_use]
pub fn playlist_type(mut self, ptype: crate::hls::PlaylistType) -> Self {
self.playlist.playlist_type = Some(ptype);
self
}
#[must_use]
pub fn add_segment(mut self, duration: Duration, uri: impl Into<String>) -> Self {
self.playlist
.segments
.push(Segment::new(duration, uri.into()));
self
}
#[must_use]
pub fn ended(mut self) -> Self {
self.playlist.ended = true;
self
}
#[must_use]
pub fn build(self) -> MediaPlaylist {
self.playlist
}
}
impl Default for MediaPlaylistBuilder {
fn default() -> Self {
Self::new()
}
}