rxliuli / joplin-utils

Joplin-based community tool
https://joplin-utils.rxliuli.com/
MIT License
236 stars 36 forks source link

[Feat]: 给「检查没有父级目录的笔记」增加自动移除重复项功能 #22

Closed jerrylususu closed 10 months ago

jerrylususu commented 2 years ago

确认事项

您运行的是我们软件的哪个版本?

joplin-batch-web

您的功能请求是否与问题有关?请描述。

似乎笔记的父级目录丢失的一个可能原因是多个设备同时向一个同步目标同步。这种情况下同一个笔记会存在两个副本,一个有父级目录,一个没有,除此之外笔记内容几乎完全相同(可能 attachment id,或者链接到其他笔记的引用 id 不同)。是否有可能改进这一工具,使其支持对笔记完全相同情况下,一键删除没有父级目录的笔记副本?

描述您想要的解决方案

我自己解决这一问题,使用了两个步骤

  1. 用 SQL 筛选出 parent_id 不存在于当前 Joplin 实例的笔记,然后把所有含有相同 title 的笔记找出来(相当于找出同一个笔记的两个副本)。将结果导出成 csv 文件。
select * from notes where notes.title in (select title from notes where notes.parent_id not in (select id from folders))
  1. 用一个简单的 Python 脚本找出两个副本中 body 存在不一致的 note pair,其他的理论上就可以安全移除了。
import csv
with open("result_csv.csv", "r", encoding="utf8") as f:    
    reader = csv.DictReader(f)
    all_notes = list(reader)

len(all_notes)

title_to_note_dict = {}
for item in all_notes:
    if item["title"] not in title_to_note_dict:
        title_to_note_dict[item["title"]] = []
    title_to_note_dict[item["title"]].append(item)

len(title_to_note_dict)

all([len(i)==2 for i in title_to_note_dict.values()])

all([i[0]["body"] == i[1]["body"] for i in title_to_note_dict.values()])

for title, notes in title_to_note_dict.items():
    if notes[0]["body"] != notes[1]["body"]:
        print(title)

描述您考虑过的替代方案

按照 joplin-batch-web 中「检查没有父级目录的笔记」输出的每个标题手动确认,但是太慢了,而且每次确认需要手动复制到其他 diff 工具中来确认两个副本是否完全一致。

其他上下文

No response

rxliuli commented 2 years ago

吾辈不确定自动合并是否是一件好事,吾辈觉得你期望的是一种类似于下面这个工具的功能,即批量找到需要处理的笔记,然后依次确认操作。

https://joplin-utils.rxliuli.com/zh/joplin-batch-web/feature.html

jerrylususu commented 2 years ago

在我自己的 use case 中,没有父级文件夹的笔记都是有父级文件夹的笔记的一份副本,内容绝大多数时候完全相同。如果内容不同(可能由于引用的 attachment 有不同的 id),我支持让用户逐个手动确认。但是如果内容完全相同,那么在做好备份的前提下,我认为一键删除(并要求二次确认)是一个合理的操作。

rxliuli commented 2 years ago

内容完全相同确实可以一键删除,不同的话要在网页上实现 diff 就感觉会比较麻烦(虽然也有现成的库吧)

谈起备份的事情吾辈就很糟心了,现在 joplin 官方的某个 bug 似乎还没动静,导致吾辈没法继续处理备份插件(好吧主要还是年底 q4 比较忙),jex 备份丢元数据对吾辈而言是不可接受的。

jerrylususu commented 2 years ago

的确,在网页上实现完全的 diff 会有些困难,因此我的提议中仅增加「对内容完全相同的笔记,删除没有父文件夹的副本」,而如果内容存在不同,则仅输出列表,要求用户手动逐个在 Joplin GUI 中处理。不过对于实现,我不太确定 Joplin 提供的 Data API 是否能实现我第一步中 SQL 的 query。

关于时间,其实这并不是一个十分紧急的需求(如果真的紧急可以用我的 workaround),所以请不用担心时间上的压力。

rxliuli commented 2 years ago

不过对于实现,我不太确定 Joplin 提供的 Data API 是否能实现我第一步中 SQL 的 query。

可以实现,性能差一点而已。先查所有没有目录的笔记。然后查询所有笔记,对比笔记的标题即可(这里有个前提是没有目录的笔记是少数)

jerrylususu commented 2 years ago

多谢说明!感觉现在的性能应该已经足够了。对工具类应用,只要有进度提示,就不太担心用户失去耐心,最坏也可以放在后台。

rxliuli commented 10 months ago

抱歉,吾辈从未真的需要这个功能,所以一直没有实现,将暂且关闭。