feat: Arbeitsordner je Video, Quellenangabe und automatisches Video-Glossar

- Ohne -o/-d schreiben yt_untertitel.py, extract_text.py und
  abschrift_korrigieren.py -u in abschriften/<Name>/ (ein Ordner je
  Video, auch für alle Ausschnitte).
- Beim Download entsteht neben dem Rohtext <Rohtext>.quelle.json mit
  Titel, Kanal, Datum und URL, für den Quellenkopf des fertigen Textes.
- Ein Glossar, das wie sein Ordner heißt (abschriften/<Name>/<Name>.glossar.txt),
  nutzen abschrift_korrigieren.py, glossar_vorschlag.py und aenderungen.py
  automatisch, nach den mit -g angegebenen gemeinsamen Glossaren.
- .gitignore: abschriften/, fertig/, *.quelle.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-11 23:24:32 +02:00
commit 3aa04fff4b

View file

@ -1,4 +1,5 @@
"""Tests for extract_text.py; yt-dlp is always replaced by fakes (no network)."""
import json
import sys
import pytest
@ -38,14 +39,19 @@ def test_default_language_is_original_audio(fake_yt_dlp, tmp_path, monkeypatch,
monkeypatch.chdir(tmp_path)
run_main(monkeypatch, "-u", URL)
text = (tmp_path / "Kanal_Eine_Rede_2026-03-28.txt").read_text(encoding="utf-8")
work = tmp_path / "abschriften" / "Kanal_Eine_Rede_2026-03-28"
text = (work / "Kanal_Eine_Rede_2026-03-28.txt").read_text(encoding="utf-8")
assert text == "Guten Abend.\nSchön, dass Sie da sind.\n"
assert "de-orig" in run.calls[1]
assert "--write-auto-subs" in run.calls[1]
out = capsys.readouterr().out
assert "Kanal_Eine_Rede_2026-03-28.txt (2 Zeilen, 7 Wörter)" in out
# Only the text file remains, no VTT
assert [p.name for p in tmp_path.iterdir()] == ["Kanal_Eine_Rede_2026-03-28.txt"]
# Only the text file and where it comes from remain, no VTT
assert sorted(p.name for p in work.iterdir()) == [
"Kanal_Eine_Rede_2026-03-28.quelle.json", "Kanal_Eine_Rede_2026-03-28.txt",
]
source = json.loads((work / "Kanal_Eine_Rede_2026-03-28.quelle.json").read_text())
assert source["kanal"] == "Kanal" and source["url"].endswith("v=abc123")
def test_default_language_ignores_dubbed_tracks(fake_yt_dlp, tmp_path, monkeypatch):
@ -133,7 +139,8 @@ def test_time_range_default_name(fake_yt_dlp, tmp_path, monkeypatch):
run_main(monkeypatch, "-u", URL, "-z", "0:00:02-0:00:03")
name = "Kanal_Eine_Rede_2026-03-28_00-00-02_bis_00-00-03.txt"
assert (tmp_path / name).read_text(encoding="utf-8") == (
work = tmp_path / "abschriften" / "Kanal_Eine_Rede_2026-03-28"
assert (work / name).read_text(encoding="utf-8") == (
"[00:00:02 - 00:00:03]\nSchön, dass Sie da sind.\n"
)
@ -183,7 +190,8 @@ def test_several_ranges_flow_text_keeps_headers(fake_yt_dlp, tmp_path, monkeypat
run_main(monkeypatch, "-u", URL, "-z", "0:00:00-0:00:30 0:02", "-f")
name = "Kanal_Eine_Rede_2026-03-28_bis_00-00-30+ab_00-02-00.txt"
assert (tmp_path / name).read_text(encoding="utf-8") == (
work = tmp_path / "abschriften" / "Kanal_Eine_Rede_2026-03-28"
assert (work / name).read_text(encoding="utf-8") == (
"[00:00:01 - 00:00:02]\nErster Satz der\nRede.\n\n"
"[00:02:00 - 00:02:01]\nDritter Satz, der\netwas länger ist.\n"
)