Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions m3u8/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import decimal
import os

from datetime import datetime

from m3u8.mixins import BasePathMixin, GroupedBasePathMixin
from m3u8.parser import format_date_time, parse
from m3u8.protocol import (
Expand Down Expand Up @@ -1472,10 +1474,14 @@ def dumps(self):
# https://tools.ietf.org/html/rfc8216#section-8.10), and also by
# real-world implementations, so we make it optional here
if self.start_date:
if isinstance(self.start_date, datetime):
self.start_date = format_date_time(self.start_date)
daterange.append("START-DATE=" + quoted(self.start_date))
if self.class_:
daterange.append("CLASS=" + quoted(self.class_))
if self.end_date:
if isinstance(self.end_date, datetime):
self.end_date = format_date_time(self.end_date)
daterange.append("END-DATE=" + quoted(self.end_date))
if self.duration:
daterange.append("DURATION=" + number_to_string(self.duration))
Expand Down
34 changes: 34 additions & 0 deletions tests/test_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -1528,6 +1528,40 @@ def test_daterange_enddate_sctecmd():
assert expected in result


def test_daterange_datetime_iso8601_t_separator_start_date_and_end_date():
start = datetime.datetime(1970, 1, 1, 0, 0, 8, tzinfo=datetime.timezone.utc)
end = datetime.datetime(1970, 1, 1, 0, 0, 24, tzinfo=datetime.timezone.utc)
dr = DateRange(id="repro", start_date=start, end_date=end, duration=16.0)
dumped_dr_str = dr.dumps()
assert 'START-DATE="1970-01-01T00:00:08+00:00"' in dumped_dr_str
assert 'END-DATE="1970-01-01T00:00:24+00:00"' in dumped_dr_str


def test_daterange_datetime_iso8601_t_separator_start_date():
playlist = m3u8.M3U8()
playlist.version = 6
playlist.target_duration = 8
playlist.playlist_type = "VOD"

segment = m3u8.Segment(uri="segment_0.ts", duration=8.0, title="")
segment.program_date_time = datetime.datetime(
1970, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc
)
playlist.segments.append(segment)

start_date_dt = datetime.datetime(1970, 1, 1, 0, 0, 8, tzinfo=datetime.timezone.utc)
dr = m3u8.DateRange(id="repro", start_date=start_date_dt, duration=16.0)

segment.dateranges.append(dr)

dumped = playlist.dumps(timespec="seconds")
dumped_str = str(dumped)
assert (
'EXT-X-DATERANGE:ID="repro",START-DATE="1970-01-01T00:00:08+00:00",DURATION=16'
in dumped_str
)


def test_daterange_in_parts():
obj = m3u8.M3U8(playlists.DATERANGE_IN_PART_PLAYLIST)

Expand Down
Loading