From a15a7ecffeb8235a8e6b0734a6b965b926fc871c Mon Sep 17 00:00:00 2001 From: Dylan De Faoite Date: Wed, 17 Dec 2025 22:42:01 +0000 Subject: [PATCH] ADD background daemon file This file checks for new files, and updates a state file that tracks all TS files and their duration --- rewind/service.py | 92 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100755 rewind/service.py diff --git a/rewind/service.py b/rewind/service.py new file mode 100755 index 0000000..14851bc --- /dev/null +++ b/rewind/service.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +import os +import datetime +import time +import obsws_python as obs +import subprocess +import json + +from video import get_duration + +INTERVAL = 10 +MAX_AGE_SECONDS = 60 * 60 * 8 +STATE_FILE = "state.json" + +def open_obs(): + subprocess.Popen(["obs", "--minimize-to-tray"]) + +def open_obs_connection() -> obs.ReqClient | None: + try: + con = obs.ReqClient() + return con + except ConnectionRefusedError: + print("Could not connect to OBS. Is it running and is the WebSocket server enabled?") + return None + +def start_recording(con): + con.start_record() + print("Started recording") + +def stop_recording(con): + con.stop_record() + print("Stopped recording") + +def cleanup_old_files(directory, max_age_seconds): + for filename in os.listdir(directory): + file_path = os.path.join(directory, filename) + if os.path.isfile(file_path): + file_age = datetime.datetime.now().timestamp() - os.path.getmtime(file_path) + if file_age > max_age_seconds: + os.remove(file_path) + print(f"Removed old file: {file_path}") + +def add_file_to_state(file_path): + state = {} + if os.path.exists(STATE_FILE): + state = json.load(open(STATE_FILE)) + files = state.get("files", []) + + if len(files) > 0: + files[len(files)-1][1] = get_duration(files[len(files)-1][0]) + + files.append([file_path, 0.0]) + json.dump(state, open(STATE_FILE, "w")) + + +def main(): + open_obs() + time.sleep(5) + + con = open_obs_connection() + if con is None: + return + + recording_dir = con.get_record_directory().record_directory + start_recording(con) + + # create state file + state = { + "files": [] + } + json.dump(state, open(STATE_FILE, "w")) + + current_files = os.listdir(recording_dir) + + while True: + cleanup_old_files(recording_dir, MAX_AGE_SECONDS) + new_files = os.listdir(recording_dir) + added_files = set(new_files) - set(current_files) + for filename in added_files: + file_path = os.path.join(recording_dir, filename) + add_file_to_state(file_path) + print(f"Added new file to state: {file_path}") + + current_files = new_files + time.sleep(INTERVAL) + + end_recording(con) + stop_recording(con) + con.disconnect() + +if __name__ == "__main__": + main() \ No newline at end of file