Pure MoonBit HLS/M3U8 playlist parser, validator, and serializer.
moon add chenqi-arch/moonhlschenqi-arch/moonhlshttps://mooncakes.io/docs/chenqi-arch/moonhlstest {
let text = #|#EXTM3U
#|#EXT-X-VERSION:7
#|#EXT-X-TARGETDURATION:10
#|#EXTINF:9.009,opening
#|segment-1.ts
#|#EXT-X-ENDLIST
match @moonhls.parse_playlist(text) {
Ok(playlist) => {
let report = @moonhls.validate_playlist(playlist)
inspect(report.ok, content="true")
inspect(@moonhls.summarize_playlist(playlist), content="kind=media, segments=1, variants=0, renditions=0, duration=9.009")
}
Err(error) => fail(error.message())
}
}moon check
moon build
moon test
moon run cmd/main
moon publish --dry-runmoon check
moon build
moon test
moon run cmd/main
moon publish --dry-runpub(all) struct HlsPlaylist {
version : Int
target_duration : Int
media_sequence : Int
discontinuity_sequence : Int
start_offset_ms : Int?
end_list : Bool
independent_segments : Bool
segments : Array[Segment]
variants : Array[VariantStream]
renditions : Array[Rendition]
unknown_tags : Array[String]
kind : PlaylistKind
} derive(Eq, Debug)pub(all) struct PlaylistStats {
kind : PlaylistKind
segment_count : Int
variant_count : Int
rendition_count : Int
total_duration_ms : Int
max_segment_ms : Int
encrypted_segments : Int
discontinuities : Int
} derive(Eq, Debug)pub(all) struct Segment {
uri : String
title : String
duration_ms : Int
byte_range : ByteRange?
key : KeyInfo?
map : SegmentMap?
discontinuity : Bool
program_date_time : String?
line : Int
} derive(Eq, Debug)pub(all) struct ValidationReport {
ok : Bool
errors : Int
warnings : Int
infos : Int
issues : Array[ValidationIssue]
} derive(Eq, Debug)pub(all) struct VariantStream {
uri : String
bandwidth : Int
average_bandwidth : Int?
codecs : String?
resolution : Resolution?
frame_rate_milli : Int?
audio_group : String?
subtitles_group : String?
closed_captions : String?
line : Int
} derive(Eq, Debug)fn rewrite_uri_prefix(playlist : HlsPlaylist, old_prefix : String, new_prefix : String) -> HlsPlaylistPure MoonBit HLS/M3U8 playlist parser, validator, and serializer.