feat: AI-generated title+tldr, subfolder structure, backlinks in transkript/zusammenfassung
- llm: generate_title_and_tldr() returns concise title and 2-3 sentence summary
- output: index in root, transkript+zusammenfassung in {base}/ subdir with backlinks
- pipeline: call generate_title_and_tldr for both solo and meeting recordings
- router: mirror subdir structure when copying to Obsidian vault
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -61,6 +61,73 @@ def list_transcripts(output_dir: str, limit: int = 20) -> list[dict]:
|
||||
return result
|
||||
|
||||
|
||||
def write_solo_docs(
|
||||
raw_text: str,
|
||||
refined: str,
|
||||
output_dir: str,
|
||||
dt: "datetime | None" = None,
|
||||
title: str = "",
|
||||
tldr: str = "",
|
||||
) -> dict[str, str]:
|
||||
"""Write index (in output_dir), transkript + zusammenfassung (in subdir)."""
|
||||
if dt is None:
|
||||
dt = datetime.now()
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
if not title:
|
||||
title = "Diktat"
|
||||
for line in refined.splitlines():
|
||||
if line.startswith("# "):
|
||||
title = line[2:].strip()
|
||||
break
|
||||
if not tldr:
|
||||
tldr = _extract_tldr(refined)
|
||||
|
||||
base = dt.strftime("%Y-%m-%d-%H%M") + "-" + slugify(title)[:50]
|
||||
date_str = dt.strftime("%d.%m.%Y %H:%M")
|
||||
frontmatter = f"---\ndate: {dt.isoformat(timespec='seconds')}\ntags: [transkript]\n---\n\n"
|
||||
|
||||
index_filename = f"{base}-index.md"
|
||||
subdir = os.path.join(output_dir, base)
|
||||
os.makedirs(subdir, exist_ok=True)
|
||||
|
||||
# --- transkript (raw whisper output, in subdir) ---
|
||||
transkript_filename = f"{base}-transkript.md"
|
||||
transkript_path = os.path.join(subdir, transkript_filename)
|
||||
with open(transkript_path, "w", encoding="utf-8") as f:
|
||||
f.write(frontmatter)
|
||||
f.write(f"# {title} — Rohtranskript\n\n")
|
||||
f.write(f"← [Index](../{index_filename})\n\n")
|
||||
f.write(raw_text)
|
||||
if not raw_text.endswith("\n"):
|
||||
f.write("\n")
|
||||
|
||||
# --- zusammenfassung (Ollama-polished, in subdir) ---
|
||||
zusammenfassung_filename = f"{base}-zusammenfassung.md"
|
||||
zusammenfassung_path = os.path.join(subdir, zusammenfassung_filename)
|
||||
with open(zusammenfassung_path, "w", encoding="utf-8") as f:
|
||||
f.write(frontmatter)
|
||||
f.write(f"← [Index](../{index_filename})\n\n")
|
||||
f.write(refined)
|
||||
if not refined.endswith("\n"):
|
||||
f.write("\n")
|
||||
|
||||
# --- index (in output_dir root) ---
|
||||
index_content = (
|
||||
f"# {title}\n\n"
|
||||
f"**Datum:** {date_str}\n\n"
|
||||
f"> {tldr}\n\n"
|
||||
f"- [Transkript]({base}/{transkript_filename})\n"
|
||||
f"- [Zusammenfassung]({base}/{zusammenfassung_filename})\n"
|
||||
)
|
||||
index_path = os.path.join(output_dir, index_filename)
|
||||
with open(index_path, "w", encoding="utf-8") as f:
|
||||
f.write(f"---\ndate: {dt.isoformat(timespec='seconds')}\ntags: [transkript, index]\n---\n\n")
|
||||
f.write(index_content)
|
||||
|
||||
return {"index": index_path, "transkript": transkript_path, "zusammenfassung": zusammenfassung_path}
|
||||
|
||||
|
||||
def write_meeting_docs(
|
||||
aligned_segments: list[tuple[str, str]],
|
||||
summary: str,
|
||||
@@ -68,49 +135,62 @@ def write_meeting_docs(
|
||||
duration_min: int,
|
||||
output_dir: str,
|
||||
dt: "datetime | None" = None,
|
||||
title: str = "",
|
||||
tldr: str = "",
|
||||
) -> dict[str, str]:
|
||||
"""Write index, transkript, and zusammenfassung. Returns {type: path}."""
|
||||
"""Write index (in output_dir), transkript + zusammenfassung (in subdir)."""
|
||||
if dt is None:
|
||||
dt = datetime.now()
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
base = dt.strftime("%Y-%m-%d-%H%M") + "-meeting"
|
||||
|
||||
if not title:
|
||||
title = f"Meeting {dt.strftime('%d.%m.%Y %H:%M')}"
|
||||
if not tldr:
|
||||
tldr = _extract_tldr(summary)
|
||||
|
||||
base = dt.strftime("%Y-%m-%d-%H%M") + "-" + slugify(title)[:50]
|
||||
date_str = dt.strftime("%d.%m.%Y %H:%M")
|
||||
frontmatter_base = f"---\ndate: {dt.isoformat(timespec='seconds')}\ntags: [transkript, meeting]\n---\n\n"
|
||||
|
||||
# --- transkript ---
|
||||
index_filename = f"{base}-index.md"
|
||||
subdir = os.path.join(output_dir, base)
|
||||
os.makedirs(subdir, exist_ok=True)
|
||||
|
||||
# --- transkript (in subdir) ---
|
||||
transcript_lines = []
|
||||
for speaker, text in aligned_segments:
|
||||
transcript_lines.append(f"**{speaker}:** {text}\n")
|
||||
transcript_content = "\n".join(transcript_lines)
|
||||
transkript_filename = f"{base}-transkript.md"
|
||||
transkript_path = os.path.join(output_dir, transkript_filename)
|
||||
transkript_path = os.path.join(subdir, transkript_filename)
|
||||
with open(transkript_path, "w", encoding="utf-8") as f:
|
||||
f.write(frontmatter_base)
|
||||
f.write(f"← [Index](../{index_filename})\n\n")
|
||||
f.write(transcript_content)
|
||||
if not transcript_content.endswith("\n"):
|
||||
f.write("\n")
|
||||
|
||||
# --- zusammenfassung ---
|
||||
# --- zusammenfassung (in subdir) ---
|
||||
zusammenfassung_filename = f"{base}-zusammenfassung.md"
|
||||
zusammenfassung_path = os.path.join(output_dir, zusammenfassung_filename)
|
||||
zusammenfassung_path = os.path.join(subdir, zusammenfassung_filename)
|
||||
with open(zusammenfassung_path, "w", encoding="utf-8") as f:
|
||||
f.write(frontmatter_base)
|
||||
f.write(f"← [Index](../{index_filename})\n\n")
|
||||
f.write(summary)
|
||||
if not summary.endswith("\n"):
|
||||
f.write("\n")
|
||||
|
||||
# --- index ---
|
||||
# --- index (in output_dir root) ---
|
||||
speaker_str = ", ".join(speakers) if speakers else "Unbekannt"
|
||||
tl_dr = _extract_tldr(summary)
|
||||
index_content = (
|
||||
f"# Meeting — {date_str}\n\n"
|
||||
f"# {title}\n\n"
|
||||
f"**Datum:** {date_str} \n"
|
||||
f"**Sprecher:** {speaker_str} \n"
|
||||
f"**Dauer:** {duration_min} min\n\n"
|
||||
f"> {tl_dr}\n\n"
|
||||
f"- [Transkript]({transkript_filename})\n"
|
||||
f"- [Zusammenfassung]({zusammenfassung_filename})\n"
|
||||
f"> {tldr}\n\n"
|
||||
f"- [Transkript]({base}/{transkript_filename})\n"
|
||||
f"- [Zusammenfassung]({base}/{zusammenfassung_filename})\n"
|
||||
)
|
||||
index_filename = f"{base}-index.md"
|
||||
index_path = os.path.join(output_dir, index_filename)
|
||||
with open(index_path, "w", encoding="utf-8") as f:
|
||||
f.write(f"---\ndate: {dt.isoformat(timespec='seconds')}\ntags: [transkript, meeting, index]\n---\n\n")
|
||||
|
||||
Reference in New Issue
Block a user