with open("backend/app/main.py", "r", encoding="utf-8") as f: content = f.read() old_split_logic = """ def run_job() -> dict: project_dir = _project_dir(project["id"]) output_dir = project_dir / "outputs" / video_id temp_dir = JOBS_DIR / job_id progress = _make_progress_updater(job_id, Path(video["filename"]).stem) outputs = mkv.build_episodes( video["file_path"], video["duration_seconds"], project["intro_seconds"], project["outro_seconds"], markers, output_dir, temp_dir, project_dir, output_prefix=output_prefix, reencode=project["reencode_enabled"], ffmpeg_pass1_template=project["ffmpeg_pass1_template"], ffmpeg_pass2_template=project["ffmpeg_pass2_template"], progress_cb=progress, log_cb=lambda message: job_manager.log(job_id, message), )""" new_split_logic = """ segment_edits = db.list_segment_edits(video_id) custom_segments = None if segment_edits: custom_segments = [(se["start_seconds"], se["end_seconds"]) for se in segment_edits if se["segment_key"].startswith("segment_")] def run_job() -> dict: project_dir = _project_dir(project["id"]) output_dir = project_dir / "outputs" / video_id temp_dir = JOBS_DIR / job_id progress = _make_progress_updater(job_id, Path(video["filename"]).stem) outputs = mkv.build_episodes( video["file_path"], video["duration_seconds"], project["intro_seconds"], project["outro_seconds"], markers, output_dir, temp_dir, project_dir, output_prefix=output_prefix, reencode=project["reencode_enabled"], ffmpeg_pass1_template=project["ffmpeg_pass1_template"], ffmpeg_pass2_template=project["ffmpeg_pass2_template"], progress_cb=progress, log_cb=lambda message: job_manager.log(job_id, message), custom_segments=custom_segments, )""" content = content.replace(old_split_logic, new_split_logic) old_split_all_ready = """ ready: list[tuple[dict, list[float]]] = [] skipped: list[dict] = [] for video in videos: try: _validate_durations(video["duration_seconds"], project["intro_seconds"], project["outro_seconds"]) except HTTPException as exc: skipped.append({"video_id": video["id"], "filename": video["filename"], "reason": exc.detail}) continue markers = sorted(db.list_markers(video["id"])) if not markers: skipped.append({"video_id": video["id"], "filename": video["filename"], "reason": "No saved markers"}) continue ready.append((video, markers))""" new_split_all_ready = """ ready: list[tuple[dict, list[float], list[tuple[float, float]] | None]] = [] skipped: list[dict] = [] for video in videos: try: _validate_durations(video["duration_seconds"], project["intro_seconds"], project["outro_seconds"]) except HTTPException as exc: skipped.append({"video_id": video["id"], "filename": video["filename"], "reason": exc.detail}) continue markers = sorted(db.list_markers(video["id"])) segment_edits = db.list_segment_edits(video["id"]) custom_segments = None if segment_edits: custom_segments = [(se["start_seconds"], se["end_seconds"]) for se in segment_edits if se["segment_key"].startswith("segment_")] if not markers and not custom_segments: skipped.append({"video_id": video["id"], "filename": video["filename"], "reason": "No saved markers or segments"}) continue ready.append((video, markers, custom_segments))""" content = content.replace(old_split_all_ready, new_split_all_ready) old_split_all_loop = """ for video_index, (video, markers) in enumerate(ready, start=1): label = f"{video_index}/{total_videos} {Path(video['filename']).stem}" output_dir = project_dir / "outputs" / video["id"] temp_dir = JOBS_DIR / job_id / video["id"] output_prefix = _sanitize_prefix(Path(video["filename"]).stem) job_manager.log(job_id, f"Starting export for {video['filename']}") outputs = mkv.build_episodes( video["file_path"], video["duration_seconds"], project["intro_seconds"], project["outro_seconds"], markers, output_dir, temp_dir, project_dir, output_prefix=output_prefix, reencode=project["reencode_enabled"], ffmpeg_pass1_template=project["ffmpeg_pass1_template"], ffmpeg_pass2_template=project["ffmpeg_pass2_template"], progress_cb=progress, log_cb=lambda message: job_manager.log(job_id, message), )""" new_split_all_loop = """ for video_index, (video, markers, custom_segments) in enumerate(ready, start=1): label = f"{video_index}/{total_videos} {Path(video['filename']).stem}" output_dir = project_dir / "outputs" / video["id"] temp_dir = JOBS_DIR / job_id / video["id"] output_prefix = _sanitize_prefix(Path(video["filename"]).stem) job_manager.log(job_id, f"Starting export for {video['filename']}") outputs = mkv.build_episodes( video["file_path"], video["duration_seconds"], project["intro_seconds"], project["outro_seconds"], markers, output_dir, temp_dir, project_dir, output_prefix=output_prefix, reencode=project["reencode_enabled"], ffmpeg_pass1_template=project["ffmpeg_pass1_template"], ffmpeg_pass2_template=project["ffmpeg_pass2_template"], progress_cb=progress, log_cb=lambda message: job_manager.log(job_id, message), custom_segments=custom_segments, )""" content = content.replace(old_split_all_loop, new_split_all_loop) with open("backend/app/main.py", "w", encoding="utf-8") as f: f.write(content) print("main.py export logic patched")