diff --git a/data/BKLibrary.sqlite-shm b/data/BKLibrary.sqlite-shm deleted file mode 100644 index fe9ac28..0000000 Binary files a/data/BKLibrary.sqlite-shm and /dev/null differ diff --git a/data/BKLibrary.sqlite-wal b/data/BKLibrary.sqlite-wal deleted file mode 100644 index e69de29..0000000 diff --git a/detaildesign.md b/detaildesign.md index ce03d57..0e8cab1 100644 --- a/detaildesign.md +++ b/detaildesign.md @@ -3,6 +3,7 @@ ## 1. 概述 本工具用于从 macOS iBooks(Apple Books)应用的数据文件中提取用户的书籍笔记,并以 Markdown 格式导出。支持从 iBooks 的数据库和 plist 文件自动同步数据,支持交互式选择书籍导出,导出内容结构清晰,便于后续整理和阅读。 +支持按最近打开时间排序书籍,菜单显示书名与时间戳,导出流程高效。 --- @@ -14,6 +15,7 @@ - 支持交互式模糊搜索选择要导出的书籍。 - 按章节导出所选书籍的所有笔记,格式为 Markdown。 - 书名中如含有“-xxxx”后缀,仅保留“-”前的主书名。 +- 书籍选择菜单按最近打开时间(last_open)降序排序,显示格式为“书名 [时间戳]”。 --- @@ -54,9 +56,11 @@ booksnote = { ### 4.3 交互式选择书籍 -- 统计每本书的最新笔记时间。 +- 读取 Books.plist 获取所有书籍元数据。 +- 读取 BKLibrary.sqlite,获取每本书的最近打开时间(last_open,苹果时间戳,基准2001-01-01)。 - 生成书名列表(优先 `displayname`,其次 `itemname`,否则用 `assetid`),并去除“-xxxx”后缀。 -- 按最新笔记时间降序排列,使用 InquirerPy 提供模糊搜索交互界面,供用户选择要导出的书籍。 +- 按 last_open 时间戳降序排列,菜单显示“书名 [时间戳]”,时间戳为 last_open 字段。 +- 使用 InquirerPy 提供模糊搜索交互界面,供用户选择要导出的书籍。 ### 4.4 导出 Markdown @@ -109,9 +113,18 @@ name = info.get('displayname') or info.get('itemname') or assetid if '-' in name: name = name.split('-', 1)[0].strip() ``` -### 7.2 交互式选择 + +### 7.2 交互式选择与排序 ```python +from booklist_parse import get_books_last_open +last_open_times = get_books_last_open('data/BKLibrary.sqlite') +for assetid, info in booksinfo.items(): + ... + ts = last_open_times.get(assetid, {}).get('last_open', 0) + assetid2lastopen[assetid] = ts +sorted_assetids = sorted(assetid2name.keys(), key=lambda aid: assetid2lastopen[aid], reverse=True) +choices = [f"{assetid2name[aid]} [{assetid2lastopen[aid]}]" for aid in sorted_assetids] answer = inquirer.fuzzy( message="请选择要导出的书名(支持模糊搜索):", choices=choices, @@ -122,28 +135,31 @@ answer = inquirer.fuzzy( --- + ## 8. 依赖说明 - Python 3 -- 主要依赖库:`InquirerPy`, `bs4`, `shutil`, `os`, `datetime` -- 需有 iBooks 数据库和 plist 文件的本地访问权限 +- 主要依赖库:`InquirerPy`, `bs4`, `shutil`, `os`, `datetime`, `sqlite3` +- 需有 iBooks 数据库、plist 文件和 BKLibrary.sqlite 的本地访问权限 --- + ## 9. 目录结构 -- `data/`:存放同步下来的数据库和 plist 文件 +- `data/`:存放同步下来的数据库和 plist 文件(含 AEAnnotation.sqlite、Books.plist、BKLibrary.sqlite 等) - `export_notes/`:导出的 Markdown 文件 - `examples/`:epub 示例文件夹 --- + ### 9.1 主要代码文件说明 -- `exportbooknotes.py`:主程序,负责数据同步、交互式选择、笔记导出等全部流程。 +- `exportbooknotes.py`:主程序,负责数据同步、交互式选择、笔记导出等全部流程,菜单排序和显示基于最近打开时间戳。 - `annotationdata.py`:负责从 iBooks 的 SQLite 数据库中解析和获取笔记数据。 -- `booklist_parse.py`:负责解析 Books.plist,获取书籍元数据(如书名、路径等)。 +- `booklist_parse.py`:负责解析 Books.plist,获取书籍元数据(如书名、路径等),并提供 get_books_last_open 读取 BKLibrary.sqlite 获取最近打开时间。 - `opf_parse.py`:负责解析 epub 的 OPF 文件,获取章节与文件映射关系。 - `toc_parse.py`:负责解析 NCX 目录文件,章节定位,以及辅助章节查找。 - `backup/booksnote.py`:备份或历史版本的笔记处理脚本。