chore: Glossare echter Beiträge nur noch lokal

*.glossar.txt enthält Namen realer Personen und Hörfehler realer
Beiträge und steht jetzt in .gitignore; versioniert bleibt nur das
Glossar der erfundenen Beispielrede (tests/daten/beispiel.glossar.txt).
Die Tests der echten Glossare laufen nur, wenn Reden und Glossare lokal
vorhanden sind; die URL-Tests nutzen ein eigenes Mini-Glossar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-11 22:44:46 +02:00
commit 33869e5f3e
4 changed files with 39 additions and 18 deletions

5
.gitignore vendored
View file

@ -15,3 +15,8 @@ output/
# Echte Reden (Urheberrecht): nur lokal; die Tests nutzen tests/daten/
testdaten/
# Glossare echter Beiträge (Namen, Hörfehler): nur lokal; ins Repository gehört
# nur das Glossar der erfundenen Beispielrede
*.glossar.txt
!tests/daten/beispiel.glossar.txt

View file

@ -303,11 +303,13 @@ Namen und Hörfehler) plus eines **je Beitrag**:
```
Das gemeinsame Glossar zuerst angeben, damit seine Ersetzungen zuerst greifen.
Im Programmordner liegen Beispiele: `krone-schmalz.glossar.txt` (gemeinsam),
`ramstein.glossar.txt`, `magdeburg.glossar.txt`, `lahnstein.glossar.txt`
(je eine Rede) und `iamfabian.glossar.txt` (Kanal über KI-Coding-Tools). Ein kleines,
leicht nachvollziehbares Glossar zur Beispielrede steht in
`tests/daten/beispiel.glossar.txt`.
Glossare enthalten Namen realer Personen und Hörfehler realer Beiträge. Sie werden
deshalb nicht ins Git-Repository übernommen: Jede Datei `*.glossar.txt` ist über
`.gitignore` ausgeschlossen und bleibt nur auf dem eigenen Rechner. Das ist
gewollt; Glossare lieber gesondert sichern. Einzige Ausnahme ist das kleine,
leicht nachvollziehbare Glossar zur erfundenen Beispielrede in
`tests/daten/beispiel.glossar.txt`, das sich gut als Vorlage eignet.
### 6.3 Entwurf vom Modell: `glossar_vorschlag.py`

View file

@ -369,11 +369,14 @@ einzelnen Beitrag deutet das auf einen Tippfehler hin, bei einem gemeinsamen Glo
es normal.
Mehrere Glossare lassen sich kombinieren: ein gemeinsames für wiederkehrende Namen
und Hörfehler eines Redners oder Kanals und eines je Beitrag. Beispiel zu den Testdaten:
`krone-schmalz.glossar.txt` (gemeinsam) plus `ramstein.glossar.txt`,
`magdeburg.glossar.txt` bzw. `lahnstein.glossar.txt`. Das gemeinsame Glossar zuerst angeben, damit seine
Ersetzungen vor den speziellen greifen. Ein weiteres Kanal-Glossar:
`iamfabian.glossar.txt` für Videos über KI-Coding-Tools (Claude Code, Codex, OpenCode …).
und Hörfehler eines Redners oder Kanals und eines je Beitrag, z. B.
`krone-schmalz.glossar.txt` (gemeinsam) plus `ramstein.glossar.txt`. Das gemeinsame
Glossar zuerst angeben, damit seine Ersetzungen vor den speziellen greifen.
Glossare gehören zu realen Beiträgen und Personen und werden deshalb nicht
versioniert: `*.glossar.txt` steht in `.gitignore`, eigene Glossare liegen nur lokal.
Im Repository ist als Beispiel nur `tests/daten/beispiel.glossar.txt` zur erfundenen
Beispielrede.
### Glossar-Entwurf: `glossar_vorschlag.py`
@ -429,9 +432,10 @@ passendes Glossar (`beispiel.glossar.txt`) für die eingebauten Hörfehler wie
```
**Nur lokal:** Echte Reden gehören wegen des Urheberrechts nicht ins Repository;
`testdaten/` ist deshalb in `.gitignore`. Liegen dort die drei Reden, mit denen das
Programm entwickelt wurde, laufen zusätzlich die Tests, die ihre Glossare prüfen;
sonst werden diese übersprungen. Die Glossare dazu sind im Repository:
`testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare (`*.glossar.txt`).
Liegen die drei Reden, mit denen das Programm entwickelt wurde, in `testdaten/` und
ihre Glossare im Programmordner, laufen zusätzlich die Tests, die diese Glossare
prüfen; sonst werden sie übersprungen:
- `ramstein.de.*`: Rede über die US Air Base Ramstein (Glossar `ramstein.glossar.txt`)
- `magdeburg.de-orig.*`: Rede in Magdeburg (Glossar `magdeburg.glossar.txt`)

View file

@ -132,10 +132,13 @@ SAMPLE_GLOSSARIES = [
]
# The real speeches are not in the repository (copyright); without them these skip
# Real speeches and their glossaries are not in the repository; without them these skip
needs_speeches = pytest.mark.skipif(
not all((SPEECHES / sample).is_file() for _, sample in SAMPLE_GLOSSARIES),
reason="echte Reden nur lokal in testdaten/",
not all(
(SPEECHES / sample).is_file() and (REPO / glossary).is_file()
for glossary, sample in SAMPLE_GLOSSARIES
) or not SHARED_GLOSSARY.is_file(),
reason="echte Reden (testdaten/) und ihre Glossare nur lokal",
)
@ -622,9 +625,16 @@ def from_url(fake_yt_dlp, yt_dlp_installed, monkeypatch):
monkeypatch.setattr(ak, "find_paragraph_starts", every_nth_start(5))
def kreml_glossary(folder):
"""The one glossary rule the fake video needs."""
path = folder / "kreml.glossar.txt"
path.write_text("Kremmel => Kreml\n", encoding="utf-8")
return path
def test_main_url_default_names(from_url, tmp_path, monkeypatch):
monkeypatch.chdir(tmp_path)
run_main(monkeypatch, "-u", URL, "-g", SHARED_GLOSSARY)
run_main(monkeypatch, "-u", URL, "-g", kreml_glossary(tmp_path))
raw = (tmp_path / "Kanal_Rede_2026-03-28.txt").read_text(encoding="utf-8")
assert raw == "Der Kremmel ist in Moskau.\nDas ist bekannt.\n"
@ -914,7 +924,7 @@ def test_main_url_several_ranges(fake_yt_dlp, yt_dlp_installed, tmp_path, monkey
monkeypatch.setattr(subprocess, "run", fake_yt_dlp(VIDEO, vtt=MULTI_VTT))
sent = chunk_recorder(monkeypatch)
monkeypatch.chdir(tmp_path)
run_main(monkeypatch, "-u", URL, "-z", "0:00:00-0:00:30 0:02", "-g", SHARED_GLOSSARY)
run_main(monkeypatch, "-u", URL, "-z", "0:00:00-0:00:30 0:02", "-g", kreml_glossary(tmp_path))
name = "Kanal_Rede_2026-03-28_bis_00-00-30+ab_00-02-00"
assert (tmp_path / f"{name}.txt").read_text(encoding="utf-8") == (