# evernote_to_joplin_mirror_v1.0 **Verze:** 1.0 | **Datum:** 2026-06-11 | **Autor:** Claude (pro V. Buzalku) Jednosměrné zrcadlení **Evernote → self-hosted Joplin Server**. Záložní „únikový východ" pro případ, že by Evernote (Bending Spoons) přestal vyhovovat — kompletní kopie poznámek na vlastním Toweru, odkud lze plynule přejít na Joplin. ## Architektura ``` Evernote cloud --(evernote-backup sync)--> en_backup.db --(tento skript)--> Joplin Server ``` - **Čtení**: přímo z `en_backup.db` přes knihovnu `evernote_backup.note_storage.SqliteStorage` (žádný ENEX mezikrok — knihovna je vlastní kód nástroje, čtení je spolehlivé). - **Zápis**: Joplin sync API `PUT /api/items/root:/.md:/content`, autentizace session tokenem z `POST /api/sessions` (header `X-API-AUTH`). ## Mapování | Evernote | Joplin | poznámka | |----------|--------|----------| | notebook | folder (`type_ 2`) | | | stack | nadřazený folder | notebooky ve stacku dostanou parent | | note | note (`type_ 1`) | tělo = ENML → HTML (`markup_language: 2`) | | en-media (příloha) | resource (`type_ 4`) + blob | odkaz v těle `:/<id>` | | en-todo | ☐ / ☑ | | **ID v Joplinu** = `md5("evernote-:")` → 32 hex. Deterministická, takže opakované běhy **aktualizují** (upsert), neduplikují. ## Použití ```bash # pilot na jednom notebooku python evernote_to_joplin_mirror_v1.0.py --notebook "CL2-78989-011" # test s limitem poznámek python evernote_to_joplin_mirror_v1.0.py --notebook "Recepty" --limit 5 # plné zrcadlení python evernote_to_joplin_mirror_v1.0.py --all # náhled bez zápisu python evernote_to_joplin_mirror_v1.0.py --all --dry-run ``` Po běhu spustit v Joplin klientovi synchronizaci, aby se položky stáhly ze serveru. ## Ověřeno (2026-06-11) - Pilot `CL2-78989-011`: 4 poznámky, text + HTML formátování věrně přeneseno. - Pilot `Recepty --limit 1`: 1 poznámka + 20 příloh; blob byte-identický (md5 shoda), tělo správně odkazuje `:/<resid>`. ## Známá omezení / TODO v1.1 - **Upsert only** — položky smazané/přejmenované v Evernote se v Joplinu zatím NEMAŽOU. Pro pravý mirror doplnit mazání (porovnat sadu GUID, smazat osiřelé `deleted_time`). - Heslo je v hlavičce skriptu plaintextem — zvážit přesun do env/konfig. - ENML→HTML je „best effort" (en-media, en-todo). Exotické prvky (en-crypt, tabulky se zvláštním stylingem) neřešeny. - Plánování zatím ručně na Z230; přesun na Tower (User Scripts cron) plánován. ## Předchůdce evernote-backup `sync` musí proběhnout před tímto skriptem (naplní/aktualizuje `en_backup.db`). Plná pipeline: `evernote-backup sync && python evernote_to_joplin_mirror_v1.0.py --all`.