fd50b7deb9
Provide a portable, cache-ignored Obsidian vault lookup plugin and bind it to Super+N.
60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Validate a vault path and resolve its registered Obsidian vault ID."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
OBSIDIAN_CONFIG = Path.home() / ".config" / "obsidian" / "obsidian.json"
|
|
|
|
|
|
def fail(message: str) -> int:
|
|
json.dump({"ok": False, "error": message}, sys.stdout)
|
|
return 1
|
|
|
|
|
|
def main() -> int:
|
|
if len(sys.argv) != 2:
|
|
return fail("No vault directory is configured")
|
|
raw_path = sys.argv[1].strip()
|
|
if not raw_path:
|
|
return fail("No vault directory is configured")
|
|
vault = Path(raw_path).expanduser().resolve()
|
|
if not vault.is_dir():
|
|
return fail(f"Vault directory was not found: {vault}")
|
|
|
|
vault_id: str | None = None
|
|
config_error: str | None = None
|
|
try:
|
|
config = json.loads(OBSIDIAN_CONFIG.read_text(encoding="utf-8"))
|
|
for registered_id, metadata in config.get("vaults", {}).items():
|
|
registered_path = Path(str(metadata.get("path", ""))).expanduser().resolve()
|
|
if registered_path == vault:
|
|
vault_id = str(registered_id)
|
|
break
|
|
except FileNotFoundError:
|
|
config_error = "Obsidian has not registered any vaults yet"
|
|
except (OSError, json.JSONDecodeError, TypeError) as error:
|
|
config_error = f"Cannot read Obsidian vault registration: {error}"
|
|
|
|
response = {
|
|
"ok": True,
|
|
"path": str(vault),
|
|
"name": vault.name,
|
|
"vaultId": vault_id,
|
|
"obsidianError": config_error
|
|
or (
|
|
None
|
|
if vault_id
|
|
else "This directory is not registered as an Obsidian vault"
|
|
),
|
|
}
|
|
json.dump(response, sys.stdout)
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|