Skip to content

Commit da79bc5

Browse files
authored
Merge pull request #489 from jmvermeulen/feature-absolute-time-player
Feature - added absolute date and time to player
2 parents 6030556 + 90bf7df commit da79bc5

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

pyrdp/player/Replay.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ def registerEvent(pdu: PlayerPDU):
6262
relativeTimestamp = absoluteTimestamp - referenceTime
6363
self.events[relativeTimestamp] = events[absoluteTimestamp]
6464

65-
self.duration = (timestamps[-1] - referenceTime) / 1000.0
65+
# Calculate total duration of replay steam
66+
self.duration = (timestamps[-1] - referenceTime) / 1000.0
67+
# Keep the referenceTime epoch as absolute starting point of the replay
68+
self.referenceTime = referenceTime
6669

6770
def __len__(self):
6871
return len(self.getSortedEvents())

pyrdp/player/ReplayBar.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# Copyright (C) 2018-2024 GoSecure Inc.
44
# Licensed under the GPLv3 or later.
55
#
6+
import datetime
67
import logging
78

89
from PySide6.QtCore import Qt, Signal
@@ -23,11 +24,14 @@ class ReplayBar(QWidget):
2324
seek = Signal(float)
2425
speedChanged = Signal(int)
2526

26-
def __init__(self, duration: float, parent: QWidget = None):
27+
def __init__(self, duration: float, referenceTime: int, parent: QWidget = None):
2728
super().__init__(parent)
2829

2930
self.log = logging.getLogger(LOGGER_NAMES.PLAYER)
30-
31+
32+
# absolute capture starting point
33+
self.referenceTime = referenceTime
34+
3135
# pretty display capture duration
3236
self.duration = duration
3337
self.duration_hours = int(self.duration // 3600)
@@ -52,6 +56,7 @@ def __init__(self, duration: float, parent: QWidget = None):
5256
self.timeSlider.valueChanged.connect(self.onSeek)
5357

5458
self.timeLabel = QLabel(self.formatTimeLabel(0))
59+
self.absoluteDateTimeLabel = QLabel(self.formatAbsoluteDateTimeLabel(0))
5560

5661
self.speedLabel = QLabel("Speed: 1x")
5762

@@ -74,6 +79,7 @@ def __init__(self, duration: float, parent: QWidget = None):
7479
horizontal.addWidget(self.button)
7580
horizontal.addWidget(self.timeSlider)
7681
horizontal.addWidget(self.timeLabel)
82+
horizontal.addWidget(self.absoluteDateTimeLabel)
7783
vertical.addLayout(horizontal)
7884

7985
self.setLayout(vertical)
@@ -101,8 +107,9 @@ def onSpeedChanged(self):
101107
def onTimeChanged(self, currentTime: float):
102108
if currentTime >= self.duration:
103109
currentTime = self.duration
104-
110+
105111
self.timeLabel.setText(self.formatTimeLabel(currentTime))
112+
self.absoluteDateTimeLabel.setText(self.formatAbsoluteDateTimeLabel(currentTime))
106113

107114
def formatTimeLabel(self, current: float) -> str:
108115
hours = int(current // 3600)
@@ -114,3 +121,10 @@ def formatTimeLabel(self, current: float) -> str:
114121
hours, minutes, seconds, self.duration_pretty)
115122
else:
116123
return "{:02d}:{:02d} / {}".format(minutes, seconds, self.duration_pretty)
124+
125+
def formatAbsoluteDateTimeLabel(self, current: int) -> str:
126+
current = current * 1000
127+
epoch_time = (self.referenceTime + current)
128+
formatted_time = datetime.datetime.fromtimestamp(epoch_time / 1000, tz=datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')
129+
130+
return formatted_time

pyrdp/player/ReplayTab.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def __init__(self, fileName: str, parent: QWidget):
4040
self.thread.clearNeeded.connect(self.clear)
4141
self.thread.start()
4242

43-
self.controlBar = ReplayBar(replay.duration)
43+
self.controlBar = ReplayBar(replay.duration, replay.referenceTime)
4444
self.controlBar.play.connect(self.thread.play)
4545
self.controlBar.pause.connect(self.thread.pause)
4646
self.controlBar.seek.connect(self.thread.seek)

0 commit comments

Comments
 (0)