z230 - Joplin mirror skripty, store_cda_batch v1.2, vyrazeni Evernote exportu a en_backup.db z gitu

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 19:45:04 +02:00
parent c4d353a343
commit d2e8a70bfe
11 changed files with 990 additions and 0 deletions
@@ -0,0 +1,69 @@
# 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:/<id>.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-<typ>:<evernote-guid>")` → 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`.