'update'
This commit is contained in:
@@ -1,4 +1,29 @@
|
||||
"""
|
||||
exportbooknotes.py
|
||||
------------------
|
||||
功能:
|
||||
- 自动同步iBooks数据库和元数据文件到本地data目录。
|
||||
- 解析AEAnnotation.sqlite、Books.plist、BKLibrary.sqlite,构建结构化笔记数据。
|
||||
- 解析epub目录和章节信息,定位每条笔记所属章节。
|
||||
- 命令行菜单按最近打开时间降序展示书籍列表,供用户选择导出。
|
||||
- 仅导出选中书籍的所有笔记,按章节分组,生成Markdown文件。
|
||||
|
||||
主要数据流:
|
||||
1. 数据同步到data目录
|
||||
2. 解析Books.plist获取书籍元数据
|
||||
3. 解析BKLibrary.sqlite获取最近打开时间
|
||||
4. 菜单排序与显示(书名+时间戳)
|
||||
5. 解析AEAnnotation.sqlite获取笔记
|
||||
6. 解析epub目录,定位章节
|
||||
7. 导出Markdown文件
|
||||
|
||||
依赖:Python 3, InquirerPy, bs4, shutil, os, datetime, sqlite3
|
||||
|
||||
典型用法:
|
||||
python exportbooknotes.py
|
||||
# 按提示选择书籍,自动导出笔记到export_notes目录
|
||||
"""
|
||||
"""
|
||||
自动生成 booksnote 数据结构:
|
||||
booksnote = {
|
||||
assetid: { label_path: { uuid: {
|
||||
@@ -17,6 +42,7 @@ from booklist_parse import parse_books_plist
|
||||
from opf_parse import parse_opf
|
||||
from toc_parse import parse_navpoints, find_label_path
|
||||
from bs4 import BeautifulSoup
|
||||
from pprint import pprint
|
||||
|
||||
def find_file_by_ext(root, exts):
|
||||
"""在root下递归查找第一个指定后缀的文件"""
|
||||
@@ -31,7 +57,11 @@ def get_toc_tree(toc_path):
|
||||
with open(toc_path, 'r', encoding='utf-8') as f:
|
||||
soup = BeautifulSoup(f, 'xml')
|
||||
nav_map = soup.find('navMap')
|
||||
return parse_navpoints(nav_map.find_all('navPoint', recursive=False))
|
||||
|
||||
nav_points = nav_map.find_all('navPoint', recursive=False)
|
||||
toc_tree = parse_navpoints(nav_points)
|
||||
#pprint(toc_tree, indent=2, depth=5)
|
||||
return toc_tree
|
||||
|
||||
def build_booksnote(annotation_db='data/AEAnnotation.sqlite', books_plist='data/Books.plist', bookid=None):
|
||||
# 支持只处理特定 assetid 的笔记
|
||||
@@ -132,7 +162,7 @@ if __name__ == '__main__':
|
||||
print(f'file not found: {src} ')
|
||||
|
||||
from booklist_parse import parse_books_plist
|
||||
from InquirerPy import inquirer
|
||||
from InquirerPy import inquirer # type: ignore
|
||||
|
||||
# 先获取所有书籍元数据
|
||||
booksinfo = parse_books_plist('data/Books.plist')
|
||||
|
||||
Reference in New Issue
Block a user