Python m3u8 parser.
The basic usage is to create a playlist object from uri, file path or directly from a string:
import m3u8 m3u8_obj = m3u8.load('http://videoserver.com/playlist.m3u8') # this could also be an absolute filename print m3u8_obj.segments print m3u8_obj.target_duration # if you already have the content as string, use m3u8_obj = m3u8.loads('#EXTM3U8 ... etc ... ')
The segments may be encrypted, in this case the key
attribute will
be an object with all the attributes from #EXT-X-KEY:
method
: ex.: "AES-128"uri
: the key uri, ex.: "http://videoserver.com/key.bin"iv
: the initialization vector, if available. OtherwiseNone
.
If no #EXT-X-KEY
is found, the key
attribute will be None
.
Multiple keys are not supported yet (and has a low priority), follow issue 1 for updates.
A playlist can have a list to other playlist files, this is used to represent multiple bitrates videos, and it's called variant streams. See an example here.
variant_m3u8 = m3u8.loads('#EXTM3U8 ... contains a variant stream ...') variant_m3u8.is_variant # in this case will be True for playlist in variant_m3u8.playlists: playlist.uri playlist.stream_info.bandwidth
the playlist object used in the for loop above has a few attributes:
uri
: the url to the streamstream_info
: aStreamInfo
object (actually a namedtuple) with all the attributes available to #EXT-X-STREAM-INFmedia
: a list of relatedMedia
objects with all the attributes available to #EXT-X-MEDIAplaylist_type
: the type of the playlist, which can be one of VOD (video on demand) or EVENT
NOTE: the following attributes are not implemented yet, follow issue 4 for updates
alternative_audios
: its an empty list, unless it's a playlist with Alternative audio, in this case it's a list withMedia
objects with all the attributes available to #EXT-X-MEDIAalternative_videos
: same asalternative_audios
A variant playlist can also have links to I-frame playlists, which are used to specify where the I-frames are in a video. See Apple's documentation on this for more information. These I-frame playlists can be accessed in a similar way to regular playlists.
variant_m3u8 = m3u8.loads('#EXTM3U ... contains a variant stream ...') for iframe_playlist in variant_m3u8.iframe_playlists: iframe_playlist.uri iframe_playlist.iframe_stream_info.bandwidth
The iframe_playlist object used in the for loop above has a few attributes:
uri
: the url to the I-frame playlistbase_uri
: the base uri of the variant playlist (if given)iframe_stream_info
: aStreamInfo
object (same as a regular playlist)
$ ./runtests
All contribution is welcome, but we will merge a pull request if, and only if, it
- has tests
- follows the code conventions
If you plan to implement a new feature or something that will take more than a few minutes, please open an issue to make sure we don't work on the same thing.