pylav.extension.m3u package

Submodules

pylav.extension.m3u.base module

async pylav.extension.m3u.base.load(self, uri, timeout=None, headers=None, custom_tags_parser=None, http_client=<pylav.extension.m3u.http_client.DefaultHTTPClient object>, verify_ssl=True)[source]

Retrieves the content from a given URI and returns a M3U8 object. Raises ValueError if invalid content or IOError if request fails.

async pylav.extension.m3u.base.load_from_file(uri, custom_tags_parser=None)[source]

Loads a m3u8 file from the filesystem

Parameters:

uri: str

uri of the m3u8 file

custom_tags_parser: callable

custom tags parser function

async pylav.extension.m3u.base.loads(self, content, uri=None, custom_tags_parser=None)[source]

Given a string with a m3u8 content, returns a M3U8 object. Optionally parses a uri to set a correct base_uri on the M3U8 object. Raises ValueError if invalid content

pylav.extension.m3u.http_client module

class pylav.extension.m3u.http_client.DefaultHTTPClient(proxies=None)[source]

Bases: object

async download(uri, timeout=None, headers=None, verify_ssl=True)[source]
proxies
class pylav.extension.m3u.http_client.HTTPSHandler(verify_ssl=True)[source]

Bases: object

pylav.extension.m3u.http_client.parsed_url(url)[source]

pylav.extension.m3u.mixins module

class pylav.extension.m3u.mixins.BasePathMixin[source]

Bases: object

property absolute_uri
property base_path
base_uri
get_path_from_uri()[source]

Some URIs have a slash in the query string

uri
class pylav.extension.m3u.mixins.GroupedBasePathMixin[source]

Bases: object

property base_path
property base_uri

pylav.extension.m3u.models module

class pylav.extension.m3u.models.ContentSteering(base_uri, server_uri, pathway_id=None)[source]

Bases: BasePathMixin

base_uri
dumps()[source]
uri
class pylav.extension.m3u.models.DateRange(**kwargs)[source]

Bases: object

dumps()[source]
class pylav.extension.m3u.models.DateRangeList(iterable=(), /)[source]

Bases: TagList

class pylav.extension.m3u.models.IFramePlaylist(base_uri, uri, iframe_stream_info)[source]

Bases: BasePathMixin

base_uri
uri
class pylav.extension.m3u.models.InitializationSection(base_uri, uri, byterange=None)[source]

Bases: BasePathMixin

base_uri
tag = '#EXT-X-MAP'
uri
class pylav.extension.m3u.models.Key(method, base_uri, uri=None, iv=None, keyformat=None, keyformatversions=None, **kwargs)[source]

Bases: BasePathMixin

base_uri
tag = '#EXT-X-KEY'
uri
class pylav.extension.m3u.models.M3U8(content=None, base_path=None, base_uri=None, strict=False, custom_tags_parser=None)[source]

Bases: object

add_iframe_playlist(iframe_playlist)[source]
add_media(media)[source]
add_playlist(playlist)[source]
add_rendition_report(report)[source]
add_segment(segment)[source]
allow_cache
property base_path
property base_uri
content_steering
data
discontinuity_sequence
async dump(filename)[source]

Saves the current m3u8 to filename

dumps()[source]

Returns the current m3u8 as a string. You could also use unicode(<this obj>) or str(<this obj>)

files
iframe_playlists
is_endlist
is_i_frames_only
is_independent_segments
is_variant
keys
media
media_sequence
part_inf
playlist_type
playlists
preload_hint
rendition_reports
segment_map
segments
server_control
session_data
session_keys
simple_attributes = (('is_variant', 'is_variant'), ('is_endlist', 'is_endlist'), ('is_i_frames_only', 'is_i_frames_only'), ('target_duration', 'targetduration'), ('media_sequence', 'media_sequence'), ('program_date_time', 'program_date_time'), ('is_independent_segments', 'is_independent_segments'), ('version', 'version'), ('allow_cache', 'allow_cache'), ('playlist_type', 'playlist_type'), ('discontinuity_sequence', 'discontinuity_sequence'))
skip
start
target_duration
version
exception pylav.extension.m3u.models.MalformedPlaylistError[source]

Bases: Exception

class pylav.extension.m3u.models.Media(uri=None, type=None, group_id=None, language=None, name=None, default=None, autoselect=None, forced=None, characteristics=None, channels=None, assoc_language=None, instream_id=None, base_uri=None, **extras)[source]

Bases: BasePathMixin

base_uri
dumps()[source]
uri
class pylav.extension.m3u.models.MediaList(iterable=(), /)[source]

Bases: TagList, GroupedBasePathMixin

property uri
class pylav.extension.m3u.models.PartInformation(part_target=None)[source]

Bases: object

dumps()[source]
part_target
class pylav.extension.m3u.models.PartialSegment(base_uri, uri, duration, program_date_time=None, current_program_date_time=None, byterange=None, independent=None, gap=None, dateranges=None, gap_tag=None)[source]

Bases: BasePathMixin

base_uri
byterange
current_program_date_time
dateranges
dumps(last_segment)[source]
duration
gap
gap_tag
independent
program_date_time
uri
class pylav.extension.m3u.models.PartialSegmentList(iterable=(), /)[source]

Bases: list, GroupedBasePathMixin

class pylav.extension.m3u.models.Playlist(uri, stream_info, media, base_uri)[source]

Bases: BasePathMixin

base_uri
uri
class pylav.extension.m3u.models.PlaylistList(iterable=(), /)[source]

Bases: TagList, GroupedBasePathMixin

class pylav.extension.m3u.models.PreloadHint(type, base_uri, uri, byterange_start=None, byterange_length=None)[source]

Bases: BasePathMixin

base_uri
dumps()[source]
uri
class pylav.extension.m3u.models.RenditionReport(base_uri, uri, last_msn, last_part=None)[source]

Bases: BasePathMixin

base_uri
dumps()[source]
uri
class pylav.extension.m3u.models.RenditionReportList(iterable=(), /)[source]

Bases: list, GroupedBasePathMixin

class pylav.extension.m3u.models.Segment(uri=None, base_uri=None, program_date_time=None, current_program_date_time=None, duration=None, title=None, bitrate=None, byterange=None, cue_out=False, cue_out_start=False, cue_in=False, discontinuity=False, key=None, scte35=None, scte35_duration=None, keyobject=None, parts=None, init_section=None, dateranges=None, gap_tag=None, custom_parser_values=None)[source]

Bases: BasePathMixin

A video segment from a M3U8 playlist

uri

a string with the segment uri

title

title attribute from EXTINF parameter

program_date_time

Returns the EXT-X-PROGRAM-DATE-TIME as a datetime. This field is only set if EXT-X-PROGRAM-DATE-TIME exists for this segment http://tools.ietf.org/html/draft-pantos-http-live-streaming-07#section-3.3.5

current_program_date_time

Returns a datetime of this segment, either the value of program_date_time when EXT-X-PROGRAM-DATE-TIME is set or a calculated value based on previous segments’ EXT-X-PROGRAM-DATE-TIME and EXTINF values

discontinuity

Returns a boolean indicating if a EXT-X-DISCONTINUITY tag exists http://tools.ietf.org/html/draft-pantos-http-live-streaming-13#section-3.4.11

cue_out_start

Returns a boolean indicating if a EXT-X-CUE-OUT tag exists

cue_out

Returns a boolean indicating if a EXT-X-CUE-OUT-CONT tag exists Note: for backwards compatibility, this will be True when cue_out_start

is True, even though this tag did not exist in the input, and EXT-X-CUE-OUT-CONT will not exist in the output

cue_in

Returns a boolean indicating if a EXT-X-CUE-IN tag exists

scte35

Base64 encoded SCTE35 metadata if available

scte35_duration

Planned SCTE35 duration

duration

duration attribute from EXTINF parameter

base_uri

uri the key comes from in URI hierarchy. ex.: http://example.com/path/to

bitrate

bitrate attribute from EXT-X-BITRATE parameter

byterange

byterange attribute from EXT-X-BYTERANGE parameter

key

Key used to encrypt the segment (EXT-X-KEY)

parts

partial segments that make up this segment

dateranges

any dateranges that should precede the segment

gap_tag

GAP tag indicates that a Media Segment is missing

custom_parser_values

Additional values which custom_tags_parser might store per segment

add_part(part)[source]
property base_path
base_uri
dumps(last_segment)[source]
uri
class pylav.extension.m3u.models.SegmentList(iterable=(), /)[source]

Bases: list, GroupedBasePathMixin

by_key(key)[source]
property uri
class pylav.extension.m3u.models.ServerControl(can_skip_until=None, can_block_reload=None, hold_back=None, part_hold_back=None, can_skip_dateranges=None)[source]

Bases: object

dumps()[source]
class pylav.extension.m3u.models.SessionData(data_id, value=None, uri=None, language=None)[source]

Bases: object

dumps()[source]
class pylav.extension.m3u.models.SessionDataList(iterable=(), /)[source]

Bases: TagList

class pylav.extension.m3u.models.SessionKey(method, base_uri, uri=None, iv=None, keyformat=None, keyformatversions=None, **kwargs)[source]

Bases: Key

base_uri
tag = '#EXT-X-SESSION-KEY'
uri
class pylav.extension.m3u.models.Skip(skipped_segments, recently_removed_dateranges=None)[source]

Bases: object

dumps()[source]
class pylav.extension.m3u.models.Start(time_offset, precise=None)[source]

Bases: object

class pylav.extension.m3u.models.StreamInfo(**kwargs)[source]

Bases: object

audio = None
average_bandwidth = None
bandwidth = None
closed_captions = None
codecs = None
frame_rate = None
hdcp_level = None
pathway_id = None
program_id = None
resolution = None
subtitles = None
video = None
video_range = None
class pylav.extension.m3u.models.TagList(iterable=(), /)[source]

Bases: list

pylav.extension.m3u.models.denormalize_attribute(attribute)[source]
pylav.extension.m3u.models.find_key(keydata, keylist)[source]
pylav.extension.m3u.models.number_to_string(number)[source]
pylav.extension.m3u.models.quoted(string)[source]

pylav.extension.m3u.parser module

exception pylav.extension.m3u.parser.ParseError(lineno, line)[source]

Bases: Exception

pylav.extension.m3u.parser.cast_date_time(value)[source]
pylav.extension.m3u.parser.format_date_time(value)[source]
pylav.extension.m3u.parser.get_segment_custom_value(state, key, default=None)[source]

Helper function for getting custom values for Segment Are useful with custom_tags_parser

pylav.extension.m3u.parser.is_url(uri)[source]
pylav.extension.m3u.parser.normalize_attribute(attribute)[source]
pylav.extension.m3u.parser.parse(content, strict=False, custom_tags_parser=None)[source]

Given a M3U8 playlist content returns a dictionary with all data found

pylav.extension.m3u.parser.remove_quotes(string)[source]

Remove quotes from string.

Ex.:

“foo” -> foo ‘foo’ -> foo ‘foo -> ‘foo

pylav.extension.m3u.parser.remove_quotes_parser(*attrs)[source]
pylav.extension.m3u.parser.save_segment_custom_value(state, key, value)[source]

Helper function for saving custom values for Segment Are useful with custom_tags_parser

pylav.extension.m3u.parser.string_to_lines(string)[source]
pylav.extension.m3u.parser.urljoin(base, url)[source]

pylav.extension.m3u.protocols module

Module contents

class pylav.extension.m3u.M3UParser(client)[source]

Bases: object

A wrapper for the M3U parser.

property client

The PyLav client.

async load(uri, timeout=None, headers=None, custom_tags_parser=None, http_client=<pylav.extension.m3u.http_client.DefaultHTTPClient object>, verify_ssl=True)

Retrieves the content from a given URI and returns a M3U8 object. Raises ValueError if invalid content or IOError if request fails.

async loads(content, uri=None, custom_tags_parser=None)

Given a string with a m3u8 content, returns a M3U8 object. Optionally parses a uri to set a correct base_uri on the M3U8 object. Raises ValueError if invalid content