[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