105 lines
2.5 KiB
Python
105 lines
2.5 KiB
Python
# Copyright 2014 Globo.com Player authors. All rights reserved.
|
|
# Use of this source code is governed by a MIT License
|
|
# license that can be found in the LICENSE file.
|
|
|
|
import os
|
|
from urllib.parse import urljoin, urlsplit
|
|
|
|
from m3u8.httpclient import DefaultHTTPClient
|
|
from m3u8.model import (
|
|
M3U8,
|
|
ContentSteering,
|
|
DateRange,
|
|
DateRangeList,
|
|
IFramePlaylist,
|
|
ImagePlaylist,
|
|
Key,
|
|
Media,
|
|
MediaList,
|
|
PartialSegment,
|
|
PartialSegmentList,
|
|
PartInformation,
|
|
Playlist,
|
|
PlaylistList,
|
|
PreloadHint,
|
|
RenditionReport,
|
|
RenditionReportList,
|
|
Segment,
|
|
SegmentList,
|
|
ServerControl,
|
|
Skip,
|
|
Start,
|
|
Tiles,
|
|
)
|
|
from m3u8.parser import ParseError, parse
|
|
|
|
__all__ = (
|
|
"M3U8",
|
|
"Segment",
|
|
"SegmentList",
|
|
"PartialSegment",
|
|
"PartialSegmentList",
|
|
"Key",
|
|
"Playlist",
|
|
"IFramePlaylist",
|
|
"Media",
|
|
"MediaList",
|
|
"PlaylistList",
|
|
"Start",
|
|
"RenditionReport",
|
|
"RenditionReportList",
|
|
"ServerControl",
|
|
"Skip",
|
|
"PartInformation",
|
|
"PreloadHint",
|
|
"DateRange",
|
|
"DateRangeList",
|
|
"ContentSteering",
|
|
"ImagePlaylist",
|
|
"Tiles",
|
|
"loads",
|
|
"load",
|
|
"parse",
|
|
"ParseError",
|
|
)
|
|
|
|
|
|
def 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
|
|
"""
|
|
|
|
if uri is None:
|
|
return M3U8(content, custom_tags_parser=custom_tags_parser)
|
|
else:
|
|
base_uri = urljoin(uri, ".")
|
|
return M3U8(content, base_uri=base_uri, custom_tags_parser=custom_tags_parser)
|
|
|
|
|
|
def load(
|
|
uri,
|
|
timeout=None,
|
|
headers={},
|
|
custom_tags_parser=None,
|
|
http_client=DefaultHTTPClient(),
|
|
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.
|
|
"""
|
|
if urlsplit(uri).scheme:
|
|
content, base_uri = http_client.download(uri, timeout, headers, verify_ssl)
|
|
return M3U8(content, base_uri=base_uri, custom_tags_parser=custom_tags_parser)
|
|
else:
|
|
return _load_from_file(uri, custom_tags_parser)
|
|
|
|
|
|
def _load_from_file(uri, custom_tags_parser=None):
|
|
with open(uri, encoding="utf8") as fileobj:
|
|
raw_content = fileobj.read().strip()
|
|
base_uri = os.path.dirname(uri)
|
|
return M3U8(raw_content, base_uri=base_uri, custom_tags_parser=custom_tags_parser)
|