feat: copy transcript to Obsidian vault on open

Config: obsidian.vault path. On Obsidian button click, file is copied to
vault dir then opened via obsidian:// URI. Vault path configurable in settings.
This commit is contained in:
2026-04-02 11:00:55 +02:00
parent 6f718f0753
commit a37e09fb4e
4 changed files with 20 additions and 1 deletions
+9 -1
View File
@@ -216,7 +216,15 @@ async def open_file(body: dict, user: dict = Depends(current_user)):
mode = body.get("mode", "editor") # "editor" | "folder" | "obsidian" mode = body.get("mode", "editor") # "editor" | "folder" | "obsidian"
if mode == "obsidian": if mode == "obsidian":
from urllib.parse import quote from urllib.parse import quote
subprocess.Popen(["xdg-open", f"obsidian://open?path={quote(path, safe='/')}"]) cfg = load_config()
vault = cfg.get("obsidian", {}).get("vault", "").strip()
if vault and os.path.isdir(vault):
dest = os.path.join(vault, os.path.basename(path))
shutil.copy2(path, dest)
target = dest
else:
target = path
subprocess.Popen(["xdg-open", f"obsidian://open?path={quote(target, safe='/')}"])
elif mode == "folder" and shutil.which("dolphin"): elif mode == "folder" and shutil.which("dolphin"):
subprocess.Popen(["dolphin", "--select", path]) subprocess.Popen(["dolphin", "--select", path])
elif mode == "folder": elif mode == "folder":
+3
View File
@@ -33,6 +33,9 @@ DEFAULTS = {
"enabled": False, "enabled": False,
"hf_token": "", "hf_token": "",
}, },
"obsidian": {
"vault": "",
},
"pid_file": os.path.expanduser("~/.local/run/tueit-transcriber.pid"), "pid_file": os.path.expanduser("~/.local/run/tueit-transcriber.pid"),
} }
+4
View File
@@ -97,6 +97,10 @@
<label>Ollama Modell</label> <label>Ollama Modell</label>
<select id="ollama-model"></select> <select id="ollama-model"></select>
</div> </div>
<div class="field">
<label>Obsidian Vault-Pfad (optional)</label>
<input type="text" id="obsidian-vault" placeholder="/mnt/d/.../obsidian">
</div>
<div class="btn-row"> <div class="btn-row">
<button class="btn primary" id="save-btn">Speichern</button> <button class="btn primary" id="save-btn">Speichern</button>
</div> </div>
+4
View File
@@ -62,6 +62,7 @@ async function loadConfig() {
const diarCfg = cfg.diarization || {}; const diarCfg = cfg.diarization || {};
document.getElementById('diar-enabled').checked = !!diarCfg.enabled; document.getElementById('diar-enabled').checked = !!diarCfg.enabled;
document.getElementById('diar-hf-token').value = diarCfg.hf_token || ''; document.getElementById('diar-hf-token').value = diarCfg.hf_token || '';
document.getElementById('obsidian-vault').value = (cfg.obsidian && cfg.obsidian.vault) || '';
} }
document.getElementById('refresh-devices-btn').addEventListener('click', loadDevices); document.getElementById('refresh-devices-btn').addEventListener('click', loadDevices);
@@ -103,6 +104,9 @@ document.getElementById('save-btn').addEventListener('click', async function() {
base_url: document.getElementById('ollama-url').value, base_url: document.getElementById('ollama-url').value,
model: document.getElementById('ollama-model').value, model: document.getElementById('ollama-model').value,
}, },
obsidian: {
vault: document.getElementById('obsidian-vault').value.trim(),
},
diarization: { diarization: {
enabled: document.getElementById('diar-enabled').checked, enabled: document.getElementById('diar-enabled').checked,
hf_token: document.getElementById('diar-hf-token').value.trim(), hf_token: document.getElementById('diar-hf-token').value.trim(),