4a7d1e6663
2. in export bulk make clear wich files will get elaborated and whick is being elaborated also add multple progress bar one for bulk one for the actual video and one for actual process (use Material You expresssive and make them clear) 3. remove save marker button; autosave then save edit 4. add paste timestamp button on hover other timestamp input 5. make unlink button not global but add a link icon colored by couple to let understand which timestamps are linked and make the single link removed (link should work that if I edit a timestamp the next/previuos based on which are linked get automatically setted to the next/previous frame timestamp) 6. I'm unable to pit whichever timestamp I want in the timestamp table for example 00:07:23.109 (the one in the frame visualizer) get automatically changed to 00:07:23.110 making the colored border not working correctly sometimes fix both
147 lines
6.4 KiB
Python
147 lines
6.4 KiB
Python
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")
|