diff --git a/edosl0util/merge.py b/edosl0util/merge.py index c11e4a1e7d8ef4857345701d72c68500cc3a2cef..d2951b5e75e08cdabe3dc55f20feee3b87bec22d 100644 --- a/edosl0util/merge.py +++ b/edosl0util/merge.py @@ -24,9 +24,9 @@ class _Ptr(object): Represents one or more packets that share the same time timecode and apid. """ - def __init__(self, fobj, timecode, apid, offset, size): + def __init__(self, fobj, stamp, apid, offset, size): self.fobj = fobj - self.timecode = timecode + self.stamp = stamp self.apid = apid self.offset = offset self.size = size @@ -41,19 +41,18 @@ class _Ptr(object): return '<{:s} {:s}>'.format(self.__class__.__name__, attrs) def __eq__(self, that): - return (self.timecode.day_segmented_timecode(), self.apid) \ - == (that.timecode.day_segmented_timecode(), that.apid) + return (self.stamp, self.apid) == (that.stamp, that.apid) def __ne__(self, that): return not self == that def __lt__(self, that): - return (self.timecode.day_segmented_timecode(), self.apid) \ - < (that.timecode.day_segmented_timecode(), that.apid) + return (self.stamp, self.apid) < (that.stamp, that.apid) + # WTF? # instances with same timecode/apid/size will compare the same - def __hash__(self): - return hash((self.timecode, self.apid, self.size)) + # def __hash__(self): + # return hash((self.stamp, self.apid, self.size)) def bytes(self): self.fobj.seek(self.offset, os.SEEK_SET) @@ -66,21 +65,21 @@ def read_packet_index(stream): # drop any leading hanging packets count = 0 packet = stream.next() - while not packet.cds_timecode: + while not packet.stamp: packet = stream.next() count += 1 if count: LOG.info('dropped %d leading packets', count) while True: - if not packet.cds_timecode: + if not packet.stamp: # corrupt packet groups can cause apid mismatch # so skip until we get to the next group packet = stream.next() continue ptr = _Ptr( stream.file, - timecode=packet.cds_timecode, + stamp=packet.stamp, apid=packet.apid, offset=packet.offset, size=packet.size, @@ -88,7 +87,7 @@ def read_packet_index(stream): index.append(ptr) # collect all packets for this timecode/group packet = stream.next() - while not packet.cds_timecode: + while not packet.stamp: # Bail if we're collecting group packets and apids don't match # This means group is corrupt if ptr.apid != packet.apid: @@ -111,7 +110,7 @@ def _sort_by_time_apid(index, order=None): index = sorted(index, key=lambda p: order.index(p.apid) if p.apid in order else -1) else: index = sorted(index, key=lambda p: p.apid) - return sorted(index, key=lambda p: p.timecode) + return sorted(index, key=lambda p: p.stamp) def _filter_duplicates_by_size(index): @@ -120,7 +119,7 @@ def _filter_duplicates_by_size(index): """ filtered = OrderedDict() for ptr in index: - key = (ptr.timecode, ptr.apid) + key = (ptr.stamp, ptr.apid) if key in filtered: if ptr.size > filtered[key].size: filtered[key] = ptr @@ -157,7 +156,7 @@ def merge(streams, output, trunc_to=None, apid_order=None): LOG.debug('writing index to %s', output) for ptr in index: if trunc_to: - if ptr.timecode >= trunc_to[0] and ptr.timecode < trunc_to[1]: + if trunc_to[0] <= ptr.stamp < trunc_to[1]: output.write(ptr.bytes()) else: output.write(ptr.bytes()) diff --git a/tests/test_merge.py b/tests/test_merge.py index 6af6c71f2cb08f762691fb6bf34687edc9905b51..572daed9ecc91854780c204764de99a62eb47231 100644 --- a/tests/test_merge.py +++ b/tests/test_merge.py @@ -1,3 +1,4 @@ +from datetime import timedelta, datetime from operator import eq, lt, gt import pytest @@ -19,14 +20,12 @@ class Test_Ptr: [(0, 0), (1, 1), lt], ]) def test_ordering(self, d1, d2, op): - time1, apid1 = d1 - ptr1 = merge._Ptr(open('/dev/null', 'r'), - headers.DaySegmentedTimecode(time1, 0, 0), - apid1, 0, 0) - - time2, apid2 = d2 - ptr2 = merge._Ptr(open('/dev/null', 'r'), - headers.DaySegmentedTimecode(time2, 0, 0), - apid2, 0, 0) + base = datetime.utcnow() + + days1, apid1 = d1 + ptr1 = merge._Ptr(open('/dev/null', 'r'), base + timedelta(days1), apid1, 0, 0) + + days2, apid2 = d2 + ptr2 = merge._Ptr(open('/dev/null', 'r'), base + timedelta(days2), apid2, 0, 0) assert op(ptr1, ptr2)