@limiteddissolve/obsidian-importer
v1.4.0
Published
Импорт путешествий из **Obsidian Vault** в **Trip Scheduler**: маршрут, day.meta-бейджи, активности, чек-листы, финансы, заметки и медиа.
Readme
@limiteddissolve/obsidian-importer
Импорт путешествий из Obsidian Vault в Trip Scheduler: маршрут, day.meta-бейджи, активности, чек-листы, финансы, заметки и медиа.
Возможности
- Автоматическое обнаружение вольтов и папок с турами (реестр Obsidian + маркер
.obsidian, WSL-пути). - Парсинг таймлайна дня, инфо-плашек
day.meta, таблиц бронирований и чек-листов. - Умная генерация активностей через LLM (AIHubMix / OpenAI: Gemini 3, Claude, DeepSeek V4, GPT-5.6) или офлайн-парсер.
- Извлечение координат из ссылок Яндекс Карт / Google Maps / 2GIS / OSM, геокодинг, индексация локальных медиа и загрузка галерей.
Install
bun add @limiteddissolve/obsidian-importerUsage
bunx --bun @limiteddissolve/obsidian-importer \
--api-url "https://trip-scheduler-api.limited-dissolve.ru" \
--dir "~/Documents/obsidian-mark/Personal Note/Travel/-- Taiwan" \
--start-date "2026-10-29" \
--status draftРежим валидации (диагностика и аудит хранилища)
Перед импортом можно запустить глубокую проверку совместимости заметок Obsidian без записи в базу данных:
# Проверка из корня монорепозитория
bun run validate:obsidian -d "@/home/injurka/Documents/obsidian-mark/Personal Note/Travel/-- Taiwan/02 - Маршрутный план"
# Или гарантированно только проверить и завершиться без вопросов
bun run import:obsidian --validate --yes -d "~/Documents/obsidian-mark/Personal Note/Travel/-- Taiwan"Валидатор автоматически:
- Поддерживает пути вида
@/path/...и разрешает подпапки (например,02 - Маршрутный план) к общему корню тура. - Проверяет структуру мастер-файла, наличие
## 📝 Краткое описание, городов и тегов. - Проверяет синтаксис строк таймлайна и находит потенциально упущенные активности (пропущенные
**, точки вместо двоеточий). - Проверяет существование локальных фотографий в папке
_по ссылкам![[...]]. - Проверяет адаптивность
<iframe>Google Maps и бейджиday.meta. - Формирует подробный отчет с оценкой совместимости в процентах (0–100%) и рекомендациями.
Для импорта используются API_URL, ADMIN_EMAIL / USER_EMAIL и ADMIN_PASSWORD / USER_PASSWORD (либо интерактивный вход). Для LLM-режима нужен AI_HUBMIX_KEY или OPENAI_API_KEY. Самостоятельный --validate --yes авторизации не требует.
Разделы бронирований: «Авто» и «Другое»
Строки сводной таблицы Транспорт.md раскладываются по разделам платформы по тексту колонки «Транспорт». Правила живут в src/lib/transport-classifier.ts — это единственный источник истины (его же использует разовая миграция):
| Что написано в «Транспорт» | Раздел | Пометка (бейдж) | | ---------------------------------------------------------- | ------ | ---------------- | | «🚖 Такси», «Яндекс Go», «Uber / Grab», «🚖 Шаттл / такси» | Авто | Такси | | «Трансфер», «Шаттл», «в аэропорт» | Авто | Трансфер | | «Авто с водителем», «с гидом» | Авто | Авто с водителем | | «Аренда / прокат авто» | Авто | Аренда авто | | «🚗 Личное авто», «машина» | Авто | Личное авто | | «🚌 Автобус», «bus», «🚌 Шаттл Taiwan Tourist Shuttle» | Авто | Автобус | | «🛵 Мотоцикл / скутер / мопед» | Авто | Мото | | «⛴️ Паром», «корабль» | Другое | Паром | | «⛵ Катер / лодка» | Другое | Катер | | «🚡 Канатная дорога», «фуникулёр», «подъёмник» | Другое | Канатная дорога | | «🚲 Велосипед», «электробайк», «самокат» | Другое | Вело | | «🚶 Пешком», «пеший переход» | Другое | Пеший переход | | «🚄 THSR», «🚆 TRA / EMU / поезд», «метро» | Поезда | — | | ни один признак не найден | Другое | Прочее |
Порядок правил важен: такси проверяется раньше трансфера («🚖 Шаттл / такси к причалу» — такси), а «автобус» — раньше «авто» (иначе подстрока «авто» перехватила бы автобус).
Секции активностей: структурированный транспорт
Внутри активности используйте YAML-блок transport. Один блок описывает один вид транспорта и может содержать несколько последовательных отрезков. В режиме чтения Obsidian локальный плагин Travel Transport View показывает компактный маршрут, а importer разбирает его без LLM:
```transport
type: metro
title: Taoyuan Airport MRT + Taipei MRT
routes:
- from: Airport Terminal 2 (A13)
to: Taipei Main Station (A1)
line: Taoyuan Airport MRT
code: A
color: "#A93C93"
direction: Taipei Main Station
stops: 2
```Для автобусов используется тот же формат с type: bus, route, operator и необязательным walk:
```transport
type: bus
title: Chiayi → Hinoki Village
routes:
- from: TRA Chiayi Station
to: Hinoki Village
route: Zhongxiao Xinmin Main Line
code: Red A
operator: Kuo-Kuang
direction: Minxiong Industrial Park Service Center
stops: 2
walk: 95 м / 2 мин
```Каждый элемент routes импортируется в порядке исходного YAML. Для metro importer создаёт sections[] с type: "metro", mode: "free", systemId: null и массивом rides, поэтому пересадки остаются отдельными отрезками. Для bus importer создаёт структурированную секцию с type: "bus" и массивом rides (маршрут, код, оператор, направление, остановки, пеший переход и цвет), которая полноценно отображается и редактируется на клиенте и сервере.
Конфигурационный файл (importer.config.json)
Вы можете настроить модели нейросетей, курсы валют для сметы, разделы по умолчанию, таймауты и параметры геокодинга через importer.config.json в корне проекта или передать путь флагом -c, --config <path>:
{
"defaultModel": "gemini-3.1-flash-lite",
"mainCurrency": "RUB",
"exchangeRates": {
"TWD": 2.8,
"USD": 90.0,
"EUR": 100.0,
"CNY": 12.5,
"JPY": 0.65,
"KRW": 0.07,
"SGD": 70.0
},
"llmTimeoutMs": 45000,
"batchSize": 8
}Programmatic API
import { discoverVaultFolders, parseObsidianTripFolder, runImport } from '@limiteddissolve/obsidian-importer'
// Найти папки туров в известных вольтах
const folders = discoverVaultFolders('Travel')
// Разобрать папку тура в структурированные данные
const trip = parseObsidianTripFolder('-- Murmansk', '2027-01-29')
// => { tripMeta, days: [...], checklists, finances, notes }
// Полный импорт (интерактивный, если нет CLI-флагов)
await runImport()License
MIT
