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:
+9
-1
@@ -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":
|
||||||
|
|||||||
@@ -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"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
Reference in New Issue
Block a user