feat: Zeitraum-Auswahl (-s/-e) auch in rede_korrigieren.py und extract_text.py

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-11 19:07:56 +02:00
commit 82489ee83c

View file

@ -12,7 +12,7 @@ import urllib.request
from aenderungen import REVIEW_MARK, print_summary, report_path, write_report
from extract_text import fetch_text
from vtt2txt import vtt_to_lines
from vtt2txt import add_time_options, check_time_range, time_suffix, vtt_to_lines
from yt_untertitel import YT_DLP, base_language, default_name, original_language
MODEL = "qwen3:32b"
@ -452,7 +452,8 @@ def parse_args():
parser.add_argument(
"-o", "--output", type=Path,
help="Ausgabedatei (Standard: <Eingabe ohne Endung>.korrigiert.txt, "
"mit -u <Kanal>_<Titel>_<Datum>.korrigiert.txt)",
"mit -u <Kanal>_<Titel>_<Datum>.korrigiert.txt; mit -s/-e zusätzlich "
"der Zeitraum)",
)
parser.add_argument(
"-g", "--glossar", type=Path, action="append", default=[],
@ -466,7 +467,10 @@ def parse_args():
"--kein-bericht", action="store_true",
help="keinen Änderungsbericht <Ausgabe>.aenderungen.html schreiben",
)
add_time_options(parser)
args = parser.parse_args()
check_time_range(parser, args)
timed = args.start is not None or args.ende is not None
for glossary in args.glossar:
if not glossary.is_file():
@ -483,8 +487,11 @@ def parse_args():
if not args.input.is_file():
parser.error(f"Eingabedatei nicht gefunden: {args.input}")
if timed and args.input.suffix.lower() != ".vtt":
parser.error("-s/-e brauchen Zeitstempel: nur mit .vtt-Eingabe oder -u.")
if args.output is None:
args.output = args.input.with_name(f"{args.input.stem}.korrigiert.txt")
suffix = time_suffix(args.start, args.ende)
args.output = args.input.with_name(f"{args.input.stem}{suffix}.korrigiert.txt")
if args.output.resolve() == args.input.resolve():
parser.error("Ausgabedatei darf nicht die Eingabedatei sein.")
return args
@ -510,20 +517,21 @@ def save_raw_text(path, raw):
def read_source(args):
"""Return the raw transcript, the output path and the language of the speech."""
if args.url is not None:
info, lines = fetch_text(args.url, args.lang)
info, lines = fetch_text(args.url, args.lang, args.start, args.ende)
lang = base_language(args.lang or original_language(info) or DEFAULT_LANGUAGE)
if lang not in PROMPTS:
raise SystemExit(
f"Die Rede ist auf „{lang}“; unterstützt: {', '.join(PROMPTS)} (-l)."
)
target = args.output or Path(f"{default_name(info)}.korrigiert.txt")
suffix = time_suffix(args.start, args.ende)
target = args.output or Path(f"{default_name(info)}{suffix}.korrigiert.txt")
raw = "\n".join(lines) + "\n"
save_raw_text(raw_text_path(target), raw)
return raw, target, lang
raw = args.input.read_text(encoding="utf-8-sig")
if args.input.suffix.lower() == ".vtt":
raw = "\n".join(vtt_to_lines(raw))
raw = "\n".join(vtt_to_lines(raw, args.start, args.ende))
return raw, args.output, base_language(args.lang or DEFAULT_LANGUAGE)
@ -560,7 +568,9 @@ def main():
chunks = split_chunks(text)
if not chunks:
raise SystemExit("Die Eingabedatei ist leer.")
if args.start is None and args.ende is None:
raise SystemExit("Die Eingabedatei ist leer.")
raise SystemExit("Die Eingabedatei enthält im gewählten Zeitraum keinen Text.")
parts_dir.mkdir(parents=True, exist_ok=True)
results = []