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:
parent
3be1ff8058
commit
33869e5f3e
4 changed files with 39 additions and 18 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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`
|
||||||
|
|
||||||
|
|
|
||||||
20
README.md
20
README.md
|
|
@ -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`)
|
||||||
|
|
|
||||||
|
|
@ -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") == (
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue