Categorygithub.com/grafov/m3u8
modulepackage
0.12.1
Repository: https://github.com/grafov/m3u8.git
Documentation: pkg.go.dev

# README

M3U8

Project status

Project support suspended and code moved to read only archive. https://github.com/grafov/m3u8/issues/225

About

This is the most complete opensource library for parsing and generating of M3U8 playlists used in HTTP Live Streaming (Apple HLS) for internet video translations.

M3U8 is simple text format and parsing library for it must be simple too. It does not offer ways to play HLS or handle playlists over HTTP. So library features are:

  • Support HLS specs up to version 5 of the protocol.
  • Parsing and generation of master-playlists and media-playlists.
  • Autodetect input streams as master or media playlists.
  • Offer structures for keeping playlists metadata.
  • Encryption keys support for use with DRM systems like Verimatrix etc.
  • Support for non standard Google Widevine tags.

The library covered by BSD 3-clause license. See LICENSE for the full text. Versions 0.8 and below was covered by GPL v3. License was changed from the version 0.9 and upper.

See the list of the library authors at AUTHORS file.

Install

go get github.com/grafov/m3u8

or get releases from https://github.com/grafov/m3u8/releases

Documentation GoDoc

Package online documentation (examples included) available at:

Supported by the HLS protocol tags and their library support explained in M3U8 cheatsheet.

Examples

Parse playlist:

	f, err := os.Open("playlist.m3u8")
	if err != nil {
		panic(err)
	}
	p, listType, err := m3u8.DecodeFrom(bufio.NewReader(f), true)
	if err != nil {
		panic(err)
	}
	switch listType {
	case m3u8.MEDIA:
		mediapl := p.(*m3u8.MediaPlaylist)
		fmt.Printf("%+v\n", mediapl)
	case m3u8.MASTER:
		masterpl := p.(*m3u8.MasterPlaylist)
		fmt.Printf("%+v\n", masterpl)
	}

Then you get filled with parsed data structures. For master playlists you get Master struct with slice consists of pointers to Variant structures (which represent playlists to each bitrate). For media playlist parser returns MediaPlaylist structure with slice of Segments. Each segment is of MediaSegment type. See structure.go or full documentation (link below).

You may use API methods to fill structures or create them manually to generate playlists. Example of media playlist generation:

	p, e := m3u8.NewMediaPlaylist(3, 10) // with window of size 3 and capacity 10
	if e != nil {
		panic(fmt.Sprintf("Creating of media playlist failed: %s", e))
	}
	for i := 0; i < 5; i++ {
		e = p.Append(fmt.Sprintf("test%d.ts", i), 6.0, "")
		if e != nil {
			panic(fmt.Sprintf("Add segment #%d to a media playlist failed: %s", i, e))
		}
	}
	fmt.Println(p.Encode().String())

Custom Tags

M3U8 supports parsing and writing of custom tags. You must implement both the CustomTag and CustomDecoder interface for each custom tag that may be encountered in the playlist. Look at the template files in example/template/ for examples on parsing custom playlist and segment tags.

Library structure

Library has compact code and bundled in three files:

  • structure.go — declares all structures related to playlists and their properties
  • reader.go — playlist parser methods
  • writer.go — playlist generator methods

Each file has own test suite placed in *_test.go accordingly.

Related links

Library usage

This library was successfully used in streaming software developed for company where I worked several years ago. It was tested then in generating of VOD and Live streams and parsing of Widevine Live streams. Also the library used in opensource software so you may look at these apps for usage examples:

Project status Go Report Card

Build Status Build Status Coverage Status

DeepSource

Code coverage: https://gocover.io/github.com/grafov/m3u8

Project maintainers

Thank to all people who contrubuted to the code and maintain it. Especially thank to the maintainers who involved in the project actively in the past and helped to keep code actual:

  • Lei Gao @leikao
  • Bradley Falzon @bradleyfalzon

New maitainers are welcome.

Alternatives

On the project start in 2013 there was no any other libs in Go for m3u8. Later the alternatives came. Some of them may be more fit current standards.

Drop a link in issue if you know other projects.

FYI M3U8 parsing/generation in other languages

# Packages

# Functions

Decode detects type of playlist and decodes it.
DecodeAttributeList turns an attribute list into a key, value map.
DecodeFrom detects type of playlist and decodes it.
DecodeWith detects the type of playlist and decodes it.
FullTimeParse implements ISO/IEC 8601:2004.
NewMasterPlaylist creates a new empty master playlist.
NewMediaPlaylist creates a new media playlist structure.
StrictTimeParse implements RFC3339 with Nanoseconds accuracy.

# Constants

DATETIME represents format of the timestamps in encoded playlists.
use 0 for not defined type.
use 0 for not defined type.
SCTE35_67_2014 defined in http://www.scte.org/documents/pdf/standards/SCTE%2067%202014.pdf.
SCTE35_OATCLS is a non-standard but common format.
SCTE35Cue_End indicates an in cue point.
SCTE35Cue_Mid indicates a segment between start and end cue points.
SCTE35Cue_Start indicates an out cue point.

# Variables

ErrPlaylistFull declares the playlist error.
TimeParse allows globally apply and/or override Time Parser function.

# Structs

Alternative structure represents EXT-X-MEDIA tag in variants.
Key structure represents information about stream encryption.
Map structure represents specifies how to obtain the Media Initialization Section required to parse the applicable Media Segments.
MasterPlaylist structure represents a master playlist which combines media playlists for multiple bitrates.
MediaPlaylist structure represents a single bitrate playlist aka media playlist.
MediaSegment structure represents a media segment included in a media playlist.
SCTE holds custom, non EXT-X-DATERANGE, SCTE-35 tags.
Variant structure represents variants for master playlist.
VariantParams structure represents additional parameters for a variant used in EXT-X-STREAM-INF and EXT-X-I-FRAME-STREAM-INF.
WV structure represents metadata for Google Widevine playlists.

# Interfaces

CustomDecoder interface for decoding custom and unsupported tags.
CustomTag interface for encoding custom and unsupported tags.
Playlist interface applied to various playlist types.

# Type aliases

ListType is type of the playlist.
MediaType is the type for EXT-X-PLAYLIST-TYPE tag.
SCTE35CueType defines the type of cue point, used by readers and writers to write a different syntax.
SCTE35Syntax defines the format of the SCTE-35 cue points which do not use the draft-pantos-http-live-streaming-19 EXT-X-DATERANGE tag and instead have their own custom tags.