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/ # Echte Reden (Urheberrecht): nur lokal; die Tests nutzen tests/daten/
testdaten/ 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. 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` Glossare enthalten Namen realer Personen und Hörfehler realer Beiträge. Sie werden
(je eine Rede) und `iamfabian.glossar.txt` (Kanal über KI-Coding-Tools). Ein kleines, deshalb nicht ins Git-Repository übernommen: Jede Datei `*.glossar.txt` ist über
leicht nachvollziehbares Glossar zur Beispielrede steht in `.gitignore` ausgeschlossen und bleibt nur auf dem eigenen Rechner. Das ist
`tests/daten/beispiel.glossar.txt`. 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` ### 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. es normal.
Mehrere Glossare lassen sich kombinieren: ein gemeinsames für wiederkehrende Namen 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: und Hörfehler eines Redners oder Kanals und eines je Beitrag, z. B.
`krone-schmalz.glossar.txt` (gemeinsam) plus `ramstein.glossar.txt`, `krone-schmalz.glossar.txt` (gemeinsam) plus `ramstein.glossar.txt`. Das gemeinsame
`magdeburg.glossar.txt` bzw. `lahnstein.glossar.txt`. Das gemeinsame Glossar zuerst angeben, damit seine Glossar zuerst angeben, damit seine Ersetzungen vor den speziellen greifen.
Ersetzungen vor den speziellen greifen. Ein weiteres Kanal-Glossar:
`iamfabian.glossar.txt` für Videos über KI-Coding-Tools (Claude Code, Codex, OpenCode …). 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` ### 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; **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 `testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare (`*.glossar.txt`).
Programm entwickelt wurde, laufen zusätzlich die Tests, die ihre Glossare prüfen; Liegen die drei Reden, mit denen das Programm entwickelt wurde, in `testdaten/` und
sonst werden diese übersprungen. Die Glossare dazu sind im Repository: 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`) - `ramstein.de.*`: Rede über die US Air Base Ramstein (Glossar `ramstein.glossar.txt`)
- `magdeburg.de-orig.*`: Rede in Magdeburg (Glossar `magdeburg.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( needs_speeches = pytest.mark.skipif(
not all((SPEECHES / sample).is_file() for _, sample in SAMPLE_GLOSSARIES), not all(
reason="echte Reden nur lokal in testdaten/", (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)) 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): def test_main_url_default_names(from_url, tmp_path, monkeypatch):
monkeypatch.chdir(tmp_path) 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") 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" 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)) monkeypatch.setattr(subprocess, "run", fake_yt_dlp(VIDEO, vtt=MULTI_VTT))
sent = chunk_recorder(monkeypatch) sent = chunk_recorder(monkeypatch)
monkeypatch.chdir(tmp_path) 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" 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") == ( assert (tmp_path / f"{name}.txt").read_text(encoding="utf-8") == (