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