summaryrefslogtreecommitdiff
path: root/tools/process-motion-timecodes.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/process-motion-timecodes.py')
-rwxr-xr-xtools/process-motion-timecodes.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/tools/process-motion-timecodes.py b/tools/process-motion-timecodes.py
new file mode 100755
index 0000000..8c9d5fc
--- /dev/null
+++ b/tools/process-motion-timecodes.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python3
+import os.path
+
+from argparse import ArgumentParser
+from datetime import datetime, timedelta
+
+DATETIME_FORMAT = '%Y-%m-%d-%H.%M.%S'
+
+
+def chunks(lst, n):
+ for i in range(0, len(lst), n):
+ yield lst[i:i + n]
+
+
+def time2seconds(time: str) -> int:
+ time, frac = time.split('.')
+ frac = int(frac)
+
+ h, m, s = [int(i) for i in time.split(':')]
+
+ return round(s + m*60 + h*3600 + frac/1000)
+
+
+def filename_to_datetime(filename: str) -> datetime:
+ filename = os.path.basename(filename).replace('record_', '').replace('.mp4', '')
+ return datetime.strptime(filename, DATETIME_FORMAT)
+
+
+if __name__ == '__main__':
+ parser = ArgumentParser()
+ parser.add_argument('--source-filename', type=str, required=True,
+ help='recording filename')
+ parser.add_argument('--timecodes', type=str, required=True,
+ help='timecodes')
+ parser.add_argument('--padding', type=int, default=2,
+ help='amount of seconds to add before and after each fragment')
+ arg = parser.parse_args()
+
+ if arg.padding < 0:
+ raise ValueError('invalid padding')
+
+ timecodes = arg.timecodes.split(',')
+ if len(timecodes) % 2 != 0:
+ raise ValueError('invalid number of timecodes')
+
+ timecodes = list(map(time2seconds, timecodes))
+ timecodes = list(chunks(timecodes, 2))
+
+ # sort out invalid fragments (dvr-scan returns them sometimes, idk why...)
+ timecodes = list(filter(lambda f: f[0] < f[1], timecodes))
+
+ file_dt = filename_to_datetime(arg.source_filename)
+
+ # https://stackoverflow.com/a/43600953
+ timecodes.sort(key=lambda interval: interval[0])
+ merged = [timecodes[0]]
+ for current in timecodes:
+ previous = merged[-1]
+ if current[0] <= previous[1]:
+ previous[1] = max(previous[1], current[1])
+ else:
+ merged.append(current)
+
+ for fragment in merged:
+ start, end = fragment
+
+ start -= arg.padding
+ end += arg.padding
+
+ if start < 0:
+ start = 0
+
+ dt1 = (file_dt + timedelta(seconds=start)).strftime(DATETIME_FORMAT)
+ dt2 = (file_dt + timedelta(seconds=end)).strftime(DATETIME_FORMAT)
+ filename = f'{dt1}__{dt2}.mp4'
+
+ print(f'{start} {end} {filename}')