从iBooks中导入高亮数据

解析iBooks的数据结构
核心是两张表:

  • ZAEANNOTATION
  • ZBKLIBRARYASSET

Annotation数据解析

Z_OPT

2 - 高亮
3 - 笔记
4 - 笔记后移除笔记
5 - ?
7 - ?
最开始以为可以区分当前笔记类型,后来发现可能是一个Operation

ZANNOTATION DELETED

iBooks的笔记删除不会删除数据,会将此字段标记为1

ZANNOTATION IS UNDERLINE

下划线标记

ZANNOTATION STYLE

  • 0 - 无
  • 1 - 绿色
  • 2 - 蓝色
  • 3 - 黄色
  • 4 - 粉色
  • 5 - 紫色

ZANNOTATION TYPE

  • 1 - 书签
  • 2 - 笔记
  • 3 - ?

发现这个字段值为0 或者 3时,对应的高亮内容是空的,很多字段和正常数据存在差异,后觉得此值为0或者3时,废弃当前记录

ZANNOTATIONREPRESENTATIVETEXT

存放了高亮部分的整段话。如果高亮是截取的一句话的一部分,这里会存储整句话

Z ANNOTATION SELECTED TEXT

高亮部分文本

Z FUTURE PROOFING5

章节

Z FUTURE PROOFING7

「Z ANNOTATION SELECTED TEXT」在「 ZANNOTATIONREPRESENTATIVETEXT」中的位置

Book数据解析

Z CONTENT TYPE

  • 1 epub
  • 3 pdf

Z STATE

  • 1 - 已下载
  • 3 - 在云端

Tips

上面两张表中的时间并不是1970开始的时间,而是2000/01/01 08:00:00开始的时间

[[海螺笔记产品思考#高亮和笔记的关系]]

MacOS应用界面开发

布局

使用Sidebar布局,并通过NavigationView + NavigationLink触发在右侧展示详情页

切换侧边栏展示

在侧边栏中,只使用List,无法触发点击后展示选中效果
使用NavigationView + NavigationLink解决

展示书本详情页时想自动隐藏侧边栏

  • 目的:扩大是书本详情页的展示范围,扩展高亮的展示范围
  • 无法识别当前侧边栏是否已经打开,功能废弃

右键扩展

右键换出菜单栏

偏好设置

SwiftUI 给 macOS App 添加设置面板 – Akring’s Blog

样式

Hover Hint

SwiftUI : How do you display a tooltip / hint on hover? - Stack Overflow
.help("Help Message")

高亮可选择复制

如果通过选择的能力,会导致长段落展示上会有问题,功能废弃
如果使用了limitLine(nil),及不限制行数,内容可自动换行,会出现点击后换行不再生效。未找到解决方案,取消了可以选择的功能

组件

下拉列表

ios - Is there a way to create a Dropdown-Menu/button in SwiftUI? - Stack Overflow

删除确认

Swift ui macOS popover on the button or on an image - Stack Overflow

Realm

更新字段名导致抛出异常

Migration with Realm
Bye Bye AppDelegate! SwiftUI App Life Cycle
macos swiftui app life cycle

使用的是环境注入RealmConfiguration,更新的配置对象解决

微信读书导入

微信登录后session保存

WKWebsiteDataStore | Apple Developer Documentation
(https://stackoverflow.com/questions/33156567/getting-all-cookies-from-wkwebview)

使用WebKit访问微信读书

使用Swiftui在macos中使用webkit - swift - Implement webkit with swiftUI on macOS (And create a preview of a webpage) - Stack Overflow
监听URL变化 - ios - SwiftUI WKWebView detect url changing - Stack Overflow
删除cookie - Clear webView cookies (Swift) - Stack Overflow

错误:Web Process Failed To Launch

WebProcessProxy::didFinishLaunching: Invalid connection identifier (web process failed to launch)
Swift / Xcode: WebProcessProxy Invalid connection identifier (web process failed to launch) - Stack Overflow
Sign & Capabilities中没有开网络权限

微信阅读爬取

https://github.com/arry-lee/wereader/blob/master/wereader.py
https://github.com/shengqiangzhang/examples-of-web-crawlers/blob/master/12.%E4%B8%80%E9%94%AE%E5%AF%BC%E5%87%BA%E5%BE%AE%E4%BF%A1%E8%AF%BB%E4%B9%A6%E7%9A%84%E4%B9%A6%E7%B1%8D%E5%92%8C%E7%AC%94%E8%AE%B0/wereader.py
https://github.com/Higurashi-kagome/pythontools/tree/master/wereader
https://blog.csdn.net/mighty13/article/details/119257353

其他

WebKit无法监听到已经登录的情况下的cookiee

书本目录

从微信阅读导入

从Google Books导入

从Epub文件提取

(24 封私信 / 80 条消息) 如何提取/导出epub/mobi电子书目录? - 知乎

Annotation

自动打开iBooks并跳转

ibooks://assetid/C0CA4834936C83FFEBEF2C046841D61B#epubcfi(/6/24[id51]!/4/230/1,:98,:176)

iBooks的Annotation的Location转换

  • locationStart计算方式
    • epubcfi(/6/10[item4]!/4[2RHM061aeacfb40be4ad888b90d36859466d6]/4/1,:62,:112)

    • 转换成

    • 10 004 004 001 062 000

    • 提取出(…)中内容

    • 通过,分割

      • 如果splitArr.length == 3, 前两位合并为开始
      • 如果splitArr.length == 2, [0]为开始
    • 通过/分割

      • 从第二位开始取值
      • 以000的格式进行拼接,010,004,062
    • 通过:分割获取偏移量

    • 最后形成010 004 004 001 062 000,并转换成数字

思考样例

{
    "iBooks": {
        "style": 3,
        "epubcfi": "epubcfi(/6/10[item4]!/4[2RHM0-61aeacfb40be4ad888b90d36859466d6]/4/1,:62,:112)",
        "startRAWLocation": 1044162,
        "endRAWLocation": 10441112
    }
}
book_id, start_location, date, content, type, raw, json
8,10 004 004 001 062 000,1657440934,如何做出有效的决策,帮助企业平稳运行,获得支持,并取得竞争优势,是各个层次决策者做决定的重要考虑因素,highlight,BFDE2CBF-9B39-4302-952B-59984C3587CC,"{""iBooks"": {""style"": 3 , ""epubcfi"": ""epubcfi(/6/10[item4]!/4[2RHM0-61aeacfb40be4ad888b90d36859466d6]/4/1,:62,:112)"" , ""startRAWLocation"": 1044162 , ""endRAWLocation"": 10441112 }}"

epubcfi(/6/28[id53]!/4/34/1,:0,:54)
9,28 004 034 001 000 000,1653407380,"",note,B7B960F3-A317-4D11-B5A6-1F8C374D1EEF_note,"{""iBooks"": {""style"": 4 , ""epubcfi"": ""epubcfi(/6/28[id53]!/4/34/1,:0,:54)"" , ""startRAWLocation"": 2843410 , ""endRAWLocation"": 28434154 }}"

epubcfi(/6/50[id218]!/4[5N3C0-9073e1cbe1fa4edc8b4c7218e09c87a0],/106/1:0,/118)
10,50 004 106 001 000 000,1651471396,"①将平常做的正念呼吸法持续做10分钟。
②在心中想象自己要给予关爱的对象,此时身体和情感会发生变化,试着将注意力放在这些变化上。
③针对那个对象,在心中默念以下句子:
·希望你能避开危险,平平安安。
·希望你幸福,安心自在。
·希望你身体健康。
",highlight,89F98E30-14B4-4454-AD5E-C28B4658E2B7,"{""iBooks"": {""style"": 3 , ""epubcfi"": ""epubcfi(/6/50[id218]!/4[5N3C0-9073e1cbe1fa4edc8b4c7218e09c87a0],/106/1:0,/118)"" , ""startRAWLocation"": 50410610 , ""endRAWLocation"": 5041180 }}"
50 4 106 1 0
50 4 118 0

epubcfi(/6/70[id231]!/4[7K4G0-9073e1cbe1fa4edc8b4c7218e09c87a0]/46,/2/1:1,/3:32)
10,70 004 046 002 001 001,1651938623,早上]可以睡到自然醒。起床后进行10分钟左右的正念呼吸,做10分钟就好,highlight,26A6B7D7-F6BA-4F0E-93C3-9810A4944D88,"{""iBooks"": {""style"": 3 , ""epubcfi"": ""epubcfi(/6/70[id231]!/4[7K4G0-9073e1cbe1fa4edc8b4c7218e09c87a0]/46,/2/1:1,/3:32)"" , ""startRAWLocation"": 70446211 , ""endRAWLocation"": 70446332 }}"

epubcfi(/6/30[id41]!/4[CCNA0-05b6553f9a17412dac9f585e0d7ad587]/2/68/3,:346,:356)
11,30 004 002 068 003 346,1640617162,corruption,highlight,5AD271C0-2D50-48AE-8267-C1B89400BACD,"{""iBooks"": {""style"": 3 , ""epubcfi"": ""epubcfi(/6/30[id41]!/4[CCNA0-05b6553f9a17412dac9f585e0d7ad587]/2/68/3,:346,:356)"" , ""startRAWLocation"": 3042683346 , ""endRAWLocation"": 3042683356 }}"



epubcfi(/6/18[item8]!/4[6LJU0-61aeacfb40be4ad888b90d36859466d6],/40/1:266,/44/1:15)
epubcfi(/6/14[item6]!/4[4OIQ0-61aeacfb40be4ad888b90d36859466d6],/122/1:0,/124/1:18)


(11条消息) EPUB CFI 规范_yin138的博客-CSDN博客