diff --git a/stacks/rpi-books-sync/README.md b/stacks/rpi-books-sync/README.md index a11f96b..1267c00 100644 --- a/stacks/rpi-books-sync/README.md +++ b/stacks/rpi-books-sync/README.md @@ -13,6 +13,7 @@ - **Односторонняя:** всё выше `## Мои мысли` перезаписывается из читалки; сам раздел и всё ниже — не трогается (свои мысли писать туда). Правки заметок — в читалке. Книгу переименовали — файл переименовывается вместе с «Моими мыслями». - Диалоги с ИИ целиком не выгружаются (владелец 2026-10-18): нужное — кнопкой «В заметки» в окне объяснения, приходит обычной заметкой. +- Обвязка книги (обложка, копирайт, предисловия, благодарности, оглавление, указатель, «об авторе», колофон…) в файлы не попадает (владелец 2026-10-18), приложения — попадают. - Файлы — только для книг, где есть заметки/рекапы. Длинные цитаты обрезаются до 1500 знаков. Удалённая из читалки книга — файл остаётся. diff --git a/stacks/rpi-books-sync/books-sync b/stacks/rpi-books-sync/books-sync index a2835e9..15d40e4 100755 --- a/stacks/rpi-books-sync/books-sync +++ b/stacks/rpi-books-sync/books-sync @@ -28,6 +28,11 @@ MINE = "## Мои мысли" QUOTE_MAX = 1500 TZ = ZoneInfo("Asia/Nicosia") KIND = {"note": "📝 Заметка", "mine": "✎ Стикер", "later": "⏳ Разобрать позже"} +# обвязка книги — в Obsidian не нужна (владелец 2026-10-18): обложка, выходные данные, предисловия, указатель… +FRONT_BACK = re.compile(r"(?i)^\s*(cover|copyright|table of contents|contents|preface|foreword|acknowledg\w*|index|" + r"about the authors?|about this book|colophon|dedication|начало книги|обложка|титул|предисловие|" + r"благодарност\w*|об этой книге|об автор\w*|иллюстрация на обложке|от издательства|оглавление|" + r"содержание|предметный указатель|указатель|выходные данные|посвящение)\b") def fetch(version): @@ -133,7 +138,9 @@ def main(): files = state.get("files", {}) changed = [] for b in data["books"]: - sel = lambda xs: [x for x in xs if x["book_id"] == b["id"]] + chs = chapters.get(b["id"], {}) + sel = lambda xs: [x for x in xs if x["book_id"] == b["id"] + and not FRONT_BACK.match(chs.get(x["chapter_idx"], {}).get("title", ""))] notes, recaps, dialogs = sel(data["notes"]), sel(data["recaps"]), [] # диалоги — только через «В заметки» if not (notes or recaps or dialogs) and str(b["id"]) not in files: continue # уже был файл, а заметок не осталось — перепишем шапкой, «Мои мысли» сохранятся