[Python-modules-commits] [python-m3u8] 01/04: Import python-m3u8_0.3.5.orig.tar.gz
Ondrej Koblizek
kobla-guest at moszumanska.debian.org
Tue Nov 14 12:20:38 UTC 2017
This is an automated email from the git hooks/post-receive script.
kobla-guest pushed a commit to branch master
in repository python-m3u8.
commit b43ae38f6188f627b83e68fb9fe46c52e6c1d462
Author: Ondřej Kobližek <koblizeko at gmail.com>
Date: Tue Nov 14 13:04:43 2017 +0100
Import python-m3u8_0.3.5.orig.tar.gz
---
README.rst | 27 +++++++++++++++++++++++++++
m3u8/model.py | 22 ++++++++++++++++++++++
m3u8/parser.py | 9 ++++++++-
m3u8/protocol.py | 1 +
setup.py | 2 +-
tests/playlists.py | 18 ++++++++++++++++++
tests/test_model.py | 18 ++++++++++++++++++
tests/test_parser.py | 12 ++++++++++++
8 files changed, 107 insertions(+), 2 deletions(-)
diff --git a/README.rst b/README.rst
index 891de7b..8d67ffe 100644
--- a/README.rst
+++ b/README.rst
@@ -34,6 +34,33 @@ directly from a string:
m3u8_obj = m3u8.loads('#EXTM3U8 ... etc ... ')
+Supported tags
+=============
+
+* #EXT-X-TARGETDURATION
+* #EXT-X-MEDIA-SEQUENCE
+* #EXT-X-PROGRAM-DATE-TIME
+* #EXT-X-MEDIA
+* #EXT-X-PLAYLIST-TYPE
+* #EXT-X-KEY
+* #EXT-X-STREAM-INF
+* #EXT-X-VERSION
+* #EXT-X-ALLOW-CACHE
+* #EXT-X-ENDLIST
+* #EXTINF
+* #EXT-X-I-FRAMES-ONLY
+* #EXT-X-BYTERANGE
+* #EXT-X-I-FRAME-STREAM-INF
+* #EXT-X-DISCONTINUITY
+* #EXT-X-CUE-OUT
+* #EXT-X-CUE-OUT-CONT
+* #EXT-X-INDEPENDENT-SEGMENTS
+* #EXT-OATCLS-SCTE35
+* #EXT-X-CUE-OUT
+* #EXT-X-CUE-IN
+* #EXT-X-CUE-SPAN
+* #EXT-X-MAP
+* #EXT-X-START
Encryption keys
---------------
diff --git a/m3u8/model.py b/m3u8/model.py
index 0ee22bb..f677b64 100644
--- a/m3u8/model.py
+++ b/m3u8/model.py
@@ -8,6 +8,7 @@ import os
import errno
import math
+from m3u8.protocol import ext_x_start
from m3u8.parser import parse, format_date_time
from m3u8.mixins import BasePathMixin, GroupedBasePathMixin
@@ -178,6 +179,9 @@ class M3U8(object):
)
self.segment_map = self.data.get('segment_map')
+ start = self.data.get('start', None)
+ self.start = start and Start(**start)
+
def __unicode__(self):
return self.dumps()
@@ -251,6 +255,8 @@ class M3U8(object):
output.append('#EXT-X-PROGRAM-DATE-TIME:' + format_date_time(self.program_date_time))
if not (self.playlist_type is None or self.playlist_type == ''):
output.append('#EXT-X-PLAYLIST-TYPE:%s' % str(self.playlist_type).upper())
+ if self.start:
+ output.append(str(self.start))
if self.is_i_frames_only:
output.append('#EXT-X-I-FRAMES-ONLY')
if self.is_variant:
@@ -676,6 +682,22 @@ class PlaylistList(list, GroupedBasePathMixin):
return '\n'.join(output)
+class Start(object):
+
+ def __init__(self, time_offset, precise=None):
+ self.time_offset = float(time_offset)
+ self.precise = precise
+
+ def __str__(self):
+ output = [
+ 'TIME-OFFSET=' + str(self.time_offset)
+ ]
+ if self.precise and self.precise in ['YES', 'NO']:
+ output.append('PRECISE=' + str(self.precise))
+
+ return ext_x_start + ':' + ','.join(output)
+
+
def find_key(keydata, keylist):
if not keydata:
return None
diff --git a/m3u8/parser.py b/m3u8/parser.py
index a5c8779..ab40716 100644
--- a/m3u8/parser.py
+++ b/m3u8/parser.py
@@ -51,7 +51,7 @@ def parse(content, strict=False):
'segments': [],
'iframe_playlists': [],
'media': [],
- 'keys': [],
+ 'keys': []
}
state = {
@@ -141,6 +141,13 @@ def parse(content, strict=False):
segment_map_info = _parse_attribute_list(protocol.ext_x_map, line, quoted_parser)
data['segment_map'] = segment_map_info
+ elif line.startswith(protocol.ext_x_start):
+ attribute_parser = {
+ "time_offset": lambda x: float(x)
+ }
+ start_info = _parse_attribute_list(protocol.ext_x_start, line, attribute_parser)
+ data['start'] = start_info
+
# Comments and whitespace
elif line.startswith('#'):
# comment
diff --git a/m3u8/protocol.py b/m3u8/protocol.py
index 5d2e678..6ede507 100644
--- a/m3u8/protocol.py
+++ b/m3u8/protocol.py
@@ -26,3 +26,4 @@ ext_x_cue_start = '#EXT-X-CUE-OUT'
ext_x_cue_end = '#EXT-X-CUE-IN'
ext_x_cue_span = '#EXT-X-CUE-SPAN'
ext_x_map = '#EXT-X-MAP'
+ext_x_start = '#EXT-X-START'
diff --git a/setup.py b/setup.py
index 1dbbdbd..efb2a59 100644
--- a/setup.py
+++ b/setup.py
@@ -12,7 +12,7 @@ setup(
name="m3u8",
author='Globo.com',
author_email='videos3 at corp.globo.com',
- version="0.3.4",
+ version="0.3.5",
license='MIT',
zip_safe=False,
include_package_data=True,
diff --git a/tests/playlists.py b/tests/playlists.py
index 20a4c32..026367a 100755
--- a/tests/playlists.py
+++ b/tests/playlists.py
@@ -15,6 +15,24 @@ http://media.example.com/entire.ts
#EXT-X-ENDLIST
'''
+SIMPLE_PLAYLIST_WITH_START_NEGATIVE_OFFSET = '''
+#EXTM3U
+#EXT-X-TARGETDURATION:5220
+#EXT-X-START:TIME-OFFSET=-2.0
+#EXTINF:5220,
+http://media.example.com/entire.ts
+#EXT-X-ENDLIST
+'''
+
+SIMPLE_PLAYLIST_WITH_START_PRECISE = '''
+#EXTM3U
+#EXT-X-TARGETDURATION:5220
+#EXT-X-START:TIME-OFFSET=10.5,PRECISE=YES
+#EXTINF:5220,
+http://media.example.com/entire.ts
+#EXT-X-ENDLIST
+'''
+
SIMPLE_PLAYLIST_FILENAME = abspath(
join(dirname(__file__), 'playlists/simple-playlist.m3u8'))
diff --git a/tests/test_model.py b/tests/test_model.py
index 4a31009..dc8b812 100755
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -8,6 +8,9 @@
import arrow
import datetime
+
+from m3u8.protocol import ext_x_start
+
import m3u8
import playlists
from m3u8.model import Segment, Key, Media
@@ -712,6 +715,21 @@ def test_segment_map_uri_attribute_with_byterange():
obj = m3u8.M3U8(playlists.MAP_URI_PLAYLIST_WITH_BYTERANGE)
assert obj.segment_map['uri'] == "main.mp4"
+
+def test_start_with_negative_offset():
+ obj = m3u8.M3U8(playlists.SIMPLE_PLAYLIST_WITH_START_NEGATIVE_OFFSET)
+ assert obj.start.time_offset == -2.0
+ assert obj.start.precise is None
+ assert ext_x_start + ':TIME-OFFSET=-2.0\n' in obj.dumps()
+
+
+def test_start_with_precise():
+ obj = m3u8.M3U8(playlists.SIMPLE_PLAYLIST_WITH_START_PRECISE)
+ assert obj.start.time_offset == 10.5
+ assert obj.start.precise == 'YES'
+ assert ext_x_start + ':TIME-OFFSET=10.5,PRECISE=YES\n' in obj.dumps()
+
+
# custom asserts
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 3ac1349..df20426 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -275,3 +275,15 @@ def test_should_parse_empty_uri_with_base_path():
assert media.uri is None
assert media.base_path is None
assert 'base_uri/' == media.base_uri
+
+
+def test_should_parse_start_with_negative_time_offset():
+ data = m3u8.parse(playlists.SIMPLE_PLAYLIST_WITH_START_NEGATIVE_OFFSET)
+ assert data['start']['time_offset'] == -2.0
+ assert not hasattr(data['start'], 'precise')
+
+
+def test_should_parse_start_with_precise():
+ data = m3u8.parse(playlists.SIMPLE_PLAYLIST_WITH_START_PRECISE)
+ assert data['start']['time_offset'] == 10.5
+ assert data['start']['precise'] == 'YES'
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-m3u8.git
More information about the Python-modules-commits
mailing list