fix: executor subtitle_writer leak + adapter Path/None-default fixes

- executor: manage subtitle_writer via ExitStack (stack.callback)
- executor: remove manual subtitle_writer.close()
- WebUI adapter: wrap source_path, output_folder, cover_image_path in Path()
- WebUI adapter: remove unused threading/time imports
- PyQt adapter: fix getattr(attr, None) or default for 4 fields
This commit is contained in:
Artem Akymenko
2026-07-21 11:47:36 +00:00
parent b1392084e1
commit d0e42ee691
3 changed files with 9 additions and 13 deletions
+1 -4
View File
@@ -134,6 +134,7 @@ def execute_conversion(
)
if subtitle_writer:
subtitle_writer.open()
stack.callback(subtitle_writer.close)
result.subtitle_paths.append(subtitle_writer.path)
# Chapter directory
@@ -381,10 +382,6 @@ def execute_conversion(
)
events.log("Outro synthesized.")
# Close subtitle writer
if subtitle_writer:
subtitle_writer.close()
# Set result metadata
result.total_chapters = len(plan.chapters)
result.total_segments = sum(len(ch.segments) for ch in plan.chapters)
+4 -4
View File
@@ -68,12 +68,12 @@ def build_conversion_request_from_thread(thread: Any) -> ConversionRequest:
voice_profile=getattr(thread, "voice_profile", None),
speed=thread.speed or 1.0,
use_gpu=thread.use_gpu,
supertonic_total_steps=getattr(thread, "supertonic_total_steps", 5),
supertonic_total_steps=getattr(thread, "supertonic_total_steps", None) or 5,
# Output Format
output_format=thread.output_format or "wav",
subtitle_mode=thread.subtitle_mode or "Disabled",
subtitle_format=getattr(thread, "subtitle_format", "srt"),
max_subtitle_words=getattr(thread, "max_subtitle_words", 50),
max_subtitle_words=getattr(thread, "max_subtitle_words", None) or 50,
# Save Options
save_mode=thread.save_option or "save_next_to_input",
output_folder=output_folder,
@@ -82,8 +82,8 @@ def build_conversion_request_from_thread(thread: Any) -> ConversionRequest:
separate_chapters_format=getattr(thread, "separate_chapters_format", "wav"),
save_as_project=getattr(thread, "save_as_project", False),
# Timing
silence_between_chapters=getattr(thread, "silence_duration", 2.0),
chapter_intro_delay=getattr(thread, "chapter_intro_delay", 0.0),
silence_between_chapters=getattr(thread, "silence_duration", None) or 2.0,
chapter_intro_delay=getattr(thread, "chapter_intro_delay", None) or 0.0,
# Content Processing
replace_single_newlines=getattr(thread, "replace_single_newlines", False),
read_title_intro=getattr(thread, "read_title_intro", False),
+4 -5
View File
@@ -14,8 +14,7 @@ never accesses Job directly.
from __future__ import annotations
import threading
import time
from pathlib import Path
from typing import Any, Callable, Dict, List, Optional
from abogen.application.conversion_request import ConversionRequest
@@ -36,7 +35,7 @@ def build_conversion_request_from_job(job: Any) -> ConversionRequest:
"""
return ConversionRequest(
# Source
source_path=job.stored_path,
source_path=Path(job.stored_path) if job.stored_path else None,
original_filename=job.original_filename,
# TTS Settings
language=job.language or "a",
@@ -53,7 +52,7 @@ def build_conversion_request_from_job(job: Any) -> ConversionRequest:
max_subtitle_words=job.max_subtitle_words or 50,
# Save Options
save_mode=job.save_mode or "save_next_to_input",
output_folder=job.output_folder,
output_folder=Path(job.output_folder) if job.output_folder else None,
save_chapters_separately=job.save_chapters_separately,
merge_chapters_at_end=job.merge_chapters_at_end,
separate_chapters_format=job.separate_chapters_format or "wav",
@@ -81,7 +80,7 @@ def build_conversion_request_from_job(job: Any) -> ConversionRequest:
# Metadata
metadata_tags=job.metadata_tags or {},
# Artifacts
cover_image_path=job.cover_image_path,
cover_image_path=Path(job.cover_image_path) if job.cover_image_path else None,
cover_image_mime=job.cover_image_mime,
generate_epub3=job.generate_epub3,
)