diff -Nru python-m3u8-0.3.4/debian/changelog python-m3u8-0.3.5/debian/changelog --- python-m3u8-0.3.4/debian/changelog 2017-11-01 07:12:27.000000000 +0000 +++ python-m3u8-0.3.5/debian/changelog 2017-11-14 12:14:21.000000000 +0000 @@ -1,3 +1,9 @@ +python-m3u8 (0.3.5-1) unstable; urgency=medium + + * New upstream release + + -- Ondřej Kobližek Tue, 14 Nov 2017 13:14:21 +0100 + python-m3u8 (0.3.4-1) unstable; urgency=medium * New upstream release diff -Nru python-m3u8-0.3.4/debian/CHANGELOG python-m3u8-0.3.5/debian/CHANGELOG --- python-m3u8-0.3.4/debian/CHANGELOG 2017-11-01 07:12:27.000000000 +0000 +++ python-m3u8-0.3.5/debian/CHANGELOG 2017-11-14 12:12:23.000000000 +0000 @@ -1,3 +1,72 @@ +commit 5a8b976e658001f9d38d5d3f28dd2d3f42c2197d +Author: Leandro Moreira +Date: Thu Nov 9 15:17:17 2017 -0200 + + release new version 0.3.5 + +commit b2345a954c510edb55f88a771e5fa464d6bac0d1 +Author: Leandro Moreira +Date: Thu Nov 9 15:13:28 2017 -0200 + + add supported tags section + +commit d8b717d8df0838dc400ceb5e24be6a878213c20b +Merge: c9bf75b d6ec551 +Author: Leandro Moreira +Date: Thu Nov 9 15:09:46 2017 -0200 + + Merge pull request #113 from blokfyuh/add-time-offset-support + + Add time offset support + +commit d6ec551f7d3c7be10ee1bed2240795ec54a3089e +Author: alexb +Date: Thu Nov 9 12:24:13 2017 -0400 + + Added unit tests + +commit 6b5d78b811c604e2978d35ce995a31efb24592d6 +Author: alexb +Date: Wed Nov 8 17:49:22 2017 -0400 + + Fixed import issue + +commit 865de12016af5091dd39d0bab71d4451421008ec +Author: alexb +Date: Wed Nov 8 17:41:36 2017 -0400 + + Protected M3U8 _initialize_attributes if not start is detected + +commit 235055e5afa4e704f3fca2a122964e77e915bb71 +Author: alexb +Date: Wed Nov 8 17:35:11 2017 -0400 + + Refactored start logic + +commit 77475250ca57fae08063bd533b5359633e6bb71a +Author: alexb +Date: Wed Nov 8 16:04:11 2017 -0400 + + Replaced '_' by '-' when dumping playlist + +commit 3a305dfe152eb3a9d14ca07a52820fe7cdcf2ee3 +Author: alexb +Date: Wed Nov 8 15:36:11 2017 -0400 + + Uppercased start param + +commit 60b23068f12dc2709dfb82d3680d573c3984c1d8 +Author: alexb +Date: Wed Nov 8 15:30:04 2017 -0400 + + Added start to simple parameters and added it to dumps logic + +commit 5a2a3a9f8869cafd30a3527c4518a5f42590ea3d +Author: alexb +Date: Wed Nov 8 15:13:45 2017 -0400 + + Added protocol and used _parse_key method + commit c9bf75b63e8eb0c2dc94bc3895d511c976f050bb Author: Leandro Moreira Date: Sun Oct 15 17:25:35 2017 -0200 diff -Nru python-m3u8-0.3.4/debian/.git-dpm python-m3u8-0.3.5/debian/.git-dpm --- python-m3u8-0.3.4/debian/.git-dpm 2017-11-01 07:00:58.000000000 +0000 +++ python-m3u8-0.3.5/debian/.git-dpm 2017-11-14 12:07:15.000000000 +0000 @@ -1,11 +1,11 @@ # see git-dpm(1) from git-dpm package -32f22672841ffbcabc55c96ae22b7343d8dfb9bb -32f22672841ffbcabc55c96ae22b7343d8dfb9bb -32f22672841ffbcabc55c96ae22b7343d8dfb9bb -32f22672841ffbcabc55c96ae22b7343d8dfb9bb -python-m3u8_0.3.4.orig.tar.gz -fd2533727a81b786a0d9602f219691902656c8f6 -23694 +b43ae38f6188f627b83e68fb9fe46c52e6c1d462 +b43ae38f6188f627b83e68fb9fe46c52e6c1d462 +b43ae38f6188f627b83e68fb9fe46c52e6c1d462 +b43ae38f6188f627b83e68fb9fe46c52e6c1d462 +python-m3u8_0.3.5.orig.tar.gz +fe300bcb90f8b43e899770ee190ae7060d602563 +24298 debianTag="debian/%e%v" patchedTag="patched/%e%v" upstreamTag="upstream/%e%u" diff -Nru python-m3u8-0.3.4/m3u8/model.py python-m3u8-0.3.5/m3u8/model.py --- python-m3u8-0.3.4/m3u8/model.py 2017-10-15 19:25:35.000000000 +0000 +++ python-m3u8-0.3.5/m3u8/model.py 2017-11-09 17:17:17.000000000 +0000 @@ -8,6 +8,7 @@ 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 @@ ) 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 @@ 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 @@ 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 -Nru python-m3u8-0.3.4/m3u8/parser.py python-m3u8-0.3.5/m3u8/parser.py --- python-m3u8-0.3.4/m3u8/parser.py 2017-10-15 19:25:35.000000000 +0000 +++ python-m3u8-0.3.5/m3u8/parser.py 2017-11-09 17:17:17.000000000 +0000 @@ -51,7 +51,7 @@ 'segments': [], 'iframe_playlists': [], 'media': [], - 'keys': [], + 'keys': [] } state = { @@ -141,6 +141,13 @@ 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 -Nru python-m3u8-0.3.4/m3u8/protocol.py python-m3u8-0.3.5/m3u8/protocol.py --- python-m3u8-0.3.4/m3u8/protocol.py 2017-10-15 19:25:35.000000000 +0000 +++ python-m3u8-0.3.5/m3u8/protocol.py 2017-11-09 17:17:17.000000000 +0000 @@ -26,3 +26,4 @@ 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 -Nru python-m3u8-0.3.4/README.rst python-m3u8-0.3.5/README.rst --- python-m3u8-0.3.4/README.rst 2017-10-15 19:25:35.000000000 +0000 +++ python-m3u8-0.3.5/README.rst 2017-11-09 17:17:17.000000000 +0000 @@ -34,6 +34,33 @@ 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 -Nru python-m3u8-0.3.4/setup.py python-m3u8-0.3.5/setup.py --- python-m3u8-0.3.4/setup.py 2017-10-15 19:25:35.000000000 +0000 +++ python-m3u8-0.3.5/setup.py 2017-11-09 17:17:17.000000000 +0000 @@ -12,7 +12,7 @@ name="m3u8", author='Globo.com', author_email='videos3@corp.globo.com', - version="0.3.4", + version="0.3.5", license='MIT', zip_safe=False, include_package_data=True, diff -Nru python-m3u8-0.3.4/tests/playlists.py python-m3u8-0.3.5/tests/playlists.py --- python-m3u8-0.3.4/tests/playlists.py 2017-10-15 19:25:35.000000000 +0000 +++ python-m3u8-0.3.5/tests/playlists.py 2017-11-09 17:17:17.000000000 +0000 @@ -15,6 +15,24 @@ #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 -Nru python-m3u8-0.3.4/tests/test_model.py python-m3u8-0.3.5/tests/test_model.py --- python-m3u8-0.3.4/tests/test_model.py 2017-10-15 19:25:35.000000000 +0000 +++ python-m3u8-0.3.5/tests/test_model.py 2017-11-09 17:17:17.000000000 +0000 @@ -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 @@ 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 -Nru python-m3u8-0.3.4/tests/test_parser.py python-m3u8-0.3.5/tests/test_parser.py --- python-m3u8-0.3.4/tests/test_parser.py 2017-10-15 19:25:35.000000000 +0000 +++ python-m3u8-0.3.5/tests/test_parser.py 2017-11-09 17:17:17.000000000 +0000 @@ -275,3 +275,15 @@ 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'