1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#![doc(html_root_url = "https://docs.rs/hls_m3u8/0.4.1")]
#![forbid(unsafe_code)]
#![warn(rust_2018_idioms)]
#![warn(
    clippy::pedantic, //
    clippy::nursery,
    clippy::cargo,
    clippy::inline_always,
)]
#![allow(
    clippy::non_ascii_literal,
    clippy::redundant_pub_crate,
    clippy::multiple_crate_versions,
    clippy::module_name_repetitions,
    clippy::default_trait_access,
    clippy::unnecessary_operation // temporary until derive-builder uses #[allow(clippy::all)]
)]
#![warn(
    clippy::clone_on_ref_ptr,
    clippy::decimal_literal_representation,
    clippy::get_unwrap,
    clippy::expect_used,
    clippy::unneeded_field_pattern,
    clippy::wrong_pub_self_convention
)]
// those should not be present in production code:
#![deny(
    clippy::print_stdout,
    clippy::todo,
    clippy::unimplemented,
    clippy::dbg_macro,
    clippy::use_debug
)]
#![warn(
    missing_docs,
    missing_copy_implementations,
    missing_debug_implementations,
    trivial_casts,
    trivial_numeric_casts
)]
//! [HLS] m3u8 parser/generator.
//!
//! # Examples
//!
//! ```
//! use hls_m3u8::MediaPlaylist;
//! use std::convert::TryFrom;
//!
//! let m3u8 = MediaPlaylist::try_from(concat!(
//!     "#EXTM3U\n",
//!     "#EXT-X-TARGETDURATION:10\n",
//!     "#EXT-X-VERSION:3\n",
//!     "#EXTINF:9.009,\n",
//!     "http://media.example.com/first.ts\n",
//!     "#EXTINF:9.009,\n",
//!     "http://media.example.com/second.ts\n",
//!     "#EXTINF:3.003,\n",
//!     "http://media.example.com/third.ts\n",
//!     "#EXT-X-ENDLIST",
//! ));
//!
//! assert!(m3u8.is_ok());
//! ```
//!
//! ## Crate Feature Flags
//!
//! The following crate feature flags are available:
//!
//! - [`backtrace`] (optional)
//!   - Enables the backtrace feature for the `Error` type.
//!   - This feature depends on the following dependencies:
//!     - [`backtrace`]
//! - [`chrono`] (optional)
//!   - Enables parsing dates and verifying them.
//!   - This feature depends on the following dependencies:
//!     - [`chrono`]
//!   - The following things will change:
//!     - [`ExtXProgramDateTime::date_time`] will change from [`String`] to
//!       `DateTime<FixedOffset>`
//!     - [`ExtXDateRange::start_date`] will change from [`String`] to
//!       `DateTime<FixedOffset>`
//!     - [`ExtXDateRange::end_date`] will change from [`String`] to
//!       `DateTime<FixedOffset>`
//!
//! They are configured in your `Cargo.toml` and can be enabled like this
//!
//! ```toml
//! hls_m3u8 = { version = "0.3", features = ["chrono", "backtrace"] }
//! ```
//!
//! [`ExtXProgramDateTime::date_time`]:
//! crate::tags::ExtXProgramDateTime::date_time
//! [`ExtXDateRange::start_date`]:
//! crate::tags::ExtXDateRange::start_date
//! [`ExtXDateRange::end_date`]:
//! crate::tags::ExtXDateRange::end_date
//! [`chrono`]: https://github.com/chronotope/chrono
//! [`backtrace`]: https://github.com/rust-lang/backtrace-rs
//! [HLS]: https://tools.ietf.org/html/rfc8216

pub use error::Error;
pub use master_playlist::MasterPlaylist;
pub use media_playlist::MediaPlaylist;
pub use media_segment::MediaSegment;

/// Builder structs
pub mod builder {
    pub use crate::master_playlist::MasterPlaylistBuilder;
    pub use crate::media_playlist::MediaPlaylistBuilder;
    pub use crate::media_segment::MediaSegmentBuilder;

    /// Builder structs for tags
    pub mod tags {
        // master playlist
        pub use crate::tags::master_playlist::media::ExtXMediaBuilder;
        pub use crate::tags::master_playlist::session_data::ExtXSessionDataBuilder;

        // media segment
        pub use crate::tags::media_segment::date_range::ExtXDateRangeBuilder;

        // media playlist
    }

    /// Builder structs for types
    pub mod types {
        pub use crate::types::decryption_key::DecryptionKeyBuilder;
        pub use crate::types::stream_data::StreamDataBuilder;
    }
}
pub mod tags;
pub mod types;

#[macro_use]
mod utils;
mod attribute;
mod error;
mod line;
mod master_playlist;
mod media_playlist;
mod media_segment;
mod traits;

pub use error::Result;
pub use stable_vec;
pub use traits::*;