m3u8_rs/lib.rs
1//! A library to parse m3u8 playlists [HTTP Live Streaming](https://tools.ietf.org/html/draft-pantos-http-live-streaming-19).
2//!
3//! # Examples
4//!
5//! Parsing a playlist and let the parser figure out if it's a media or master playlist.
6//!
7//! ```
8//! use m3u8_rs::Playlist;
9//! use nom::IResult;
10//! use std::io::Read;
11//!
12//! let mut file = std::fs::File::open("playlist.m3u8").unwrap();
13//! let mut bytes: Vec<u8> = Vec::new();
14//! file.read_to_end(&mut bytes).unwrap();
15//!
16//! match m3u8_rs::parse_playlist(&bytes) {
17//! Result::Ok((i, Playlist::MasterPlaylist(pl))) => println!("Master playlist:\n{:?}", pl),
18//! Result::Ok((i, Playlist::MediaPlaylist(pl))) => println!("Media playlist:\n{:?}", pl),
19//! Result::Err(e) => panic!("Parsing error: \n{}", e),
20//! }
21//! ```
22//!
23//! Parsing a master playlist directly
24//!
25//! ```
26//! use std::io::Read;
27//! use nom::IResult;
28//!
29//! let mut file = std::fs::File::open("masterplaylist.m3u8").unwrap();
30//! let mut bytes: Vec<u8> = Vec::new();
31//! file.read_to_end(&mut bytes).unwrap();
32//!
33//! if let Result::Ok((_, pl)) = m3u8_rs::parse_master_playlist(&bytes) {
34//! println!("{:?}", pl);
35//! }
36//! ```
37//!
38//! Creating a playlist and writing it back to a vec/file
39//!
40//! ```
41//! use m3u8_rs::{MediaPlaylist, MediaPlaylistType, MediaSegment};
42//!
43//! let playlist = MediaPlaylist {
44//! version: Some(6),
45//! target_duration: 3,
46//! media_sequence: 338559,
47//! discontinuity_sequence: 1234,
48//! end_list: true,
49//! playlist_type: Some(MediaPlaylistType::Vod),
50//! segments: vec![
51//! MediaSegment {
52//! uri: "20140311T113819-01-338559live.ts".into(),
53//! duration: 2.002,
54//! title: Some("title".into()),
55//! ..Default::default()
56//! },
57//! ],
58//! ..Default::default()
59//! };
60//!
61//! //let mut v: Vec<u8> = Vec::new();
62//! //playlist.write_to(&mut v).unwrap();
63//!
64//! //let mut file = std::fs::File::open("playlist.m3u8").unwrap();
65//! //playlist.write_to(&mut file).unwrap();
66//! ```
67//!
68//! Controlling the output precision for floats, such as #EXTINF (default is unset)
69//!
70//! ```
71//! use std::sync::atomic::Ordering;
72//! use m3u8_rs::{WRITE_OPT_FLOAT_PRECISION, MediaPlaylist, MediaSegment};
73//!
74//! WRITE_OPT_FLOAT_PRECISION.store(5, Ordering::Relaxed);
75//!
76//! let playlist = MediaPlaylist {
77//! target_duration: 3,
78//! segments: vec![
79//! MediaSegment {
80//! duration: 2.9,
81//! title: Some("title".into()),
82//! ..Default::default()
83//! },
84//! ],
85//! ..Default::default()
86//! };
87//!
88//! let mut v: Vec<u8> = Vec::new();
89//!
90//! playlist.write_to(&mut v).unwrap();
91//! let m3u8_str: &str = std::str::from_utf8(&v).unwrap();
92//! assert!(m3u8_str.contains("#EXTINF:2.90000,title"));
93
94mod playlist;
95pub use playlist::*;
96
97#[cfg(feature = "parser")]
98mod parser;
99
100#[cfg(feature = "parser")]
101pub use self::parser::*;