From d98dc8fa7038e712054fa5e8dc4f79f792051dd2 Mon Sep 17 00:00:00 2001 From: Dylan De Faoite Date: Wed, 17 Dec 2025 23:52:00 +0000 Subject: [PATCH] MOVE write_state and load_state functions to paths.py This is to encapsulate all path and state file related operations within the paths module. --- rewind/paths.py | 15 ++++++++++----- rewind/service.py | 39 ++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/rewind/paths.py b/rewind/paths.py index e53086a..3953dcb 100644 --- a/rewind/paths.py +++ b/rewind/paths.py @@ -12,9 +12,14 @@ def state_dir() -> Path: def get_state_file_path() -> Path: return state_dir() / "state.json" -def get_state_file() -> dict: - path = get_state_file_path() - if not path.exists(): +def load_state() -> dict: + if not get_state_file_path.exists(): return {"files": []} - with path.open() as f: - return json.load(f) \ No newline at end of file + with get_state_file_path.open() as f: + return json.load(f) + +def write_state(state: dict): + tmp = get_state_file_path().with_suffix(".tmp") + with tmp.open("w") as f: + json.dump(state, f, indent=2) + tmp.replace(get_state_file_path()) # atomic diff --git a/rewind/service.py b/rewind/service.py index 14851bc..3f4a449 100755 --- a/rewind/service.py +++ b/rewind/service.py @@ -7,10 +7,10 @@ import subprocess import json from video import get_duration +from paths import load_state, write_state INTERVAL = 10 MAX_AGE_SECONDS = 60 * 60 * 8 -STATE_FILE = "state.json" def open_obs(): subprocess.Popen(["obs", "--minimize-to-tray"]) @@ -36,46 +36,52 @@ def cleanup_old_files(directory, max_age_seconds): 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: + if file_age > max_age_seconds and filename.endswith(".ts"): os.remove(file_path) print(f"Removed old file: {file_path}") + +def create_state_file(): + state = {"files": []} + write_state(state) + def add_file_to_state(file_path): - state = {} - if os.path.exists(STATE_FILE): - state = json.load(open(STATE_FILE)) + state = load_state() files = state.get("files", []) - if len(files) > 0: - files[len(files)-1][1] = get_duration(files[len(files)-1][0]) + # Update duration of last file if exists + if files and len(files) > 0: + last_file = files[-1] + last_file["duration"] = get_duration(last_file["path"]) - files.append([file_path, 0.0]) - json.dump(state, open(STATE_FILE, "w")) + files.append({ + "path": file_path, + "duration": 0.0 + }) + state["files"] = files + write_state(state) 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")) + create_state_file() 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) + + # Add new files to state for filename in added_files: file_path = os.path.join(recording_dir, filename) add_file_to_state(file_path) @@ -84,7 +90,6 @@ def main(): current_files = new_files time.sleep(INTERVAL) - end_recording(con) stop_recording(con) con.disconnect()