Skip to content

Conversation

@chenxiex
Copy link

@chenxiex chenxiex commented Aug 16, 2025

该 PR 旨在解决 #124

TODO

  • 实现获取子文件夹下文件
  • 实现播放时播放相关文件

@chenxiex
Copy link
Author

我仔细研究了 OneDrive 的搜索 API 之后,发现它有很多限制:

  1. 子目录这个参数似乎对它完全无效。它不严格遵守子目录的路径限制,甚至不会将指定子目录下的文件排在前面。
  2. 它不保证返回结果的完整性。分页也无法获得完整的结果。

以上限制导致,在某个目录下进行搜索,很可能根本无法搜索到该目录下的结果。我稍微看了下 OneDrive 搜索 API,也没有看到什么有用的信息。高级的 Microsoft 搜索 API 倒是提供高级搜索,但是这个 API 对于个人用户不可用。如果不能解决以上限制,那这条路可能走不通。

@nini22P
Copy link
Owner

nini22P commented Aug 16, 2025

我查看微软相关的网站,在graph-explorer尝试了不同的api组合,也总是会返回全部搜索条目。
https://developer.microsoft.com/en-us/graph/graph-explorer

@chenxiex
Copy link
Author

chenxiex commented Aug 17, 2025

鉴于 /search api 无法胜任这个任务,我参考大规模发现文件和检测更改的最佳做法,使用 /delta api 获取所有子文件夹中的文件。该 api 可以准确获取某个路径下的所有文件,并且可以返回完整的结果。我编写了一个粗糙的实验性的实现,在我的具有 2000+ 音频文件和大量子文件夹的文件夹中,它似乎是工作正确的(包括子文件夹本身在内,总共返回了 6000+ 项结果,扫了一眼应该都在指定目录下,没有详细确认)。

我觉得这条路是可行的。目前仍有如下问题:

  1. /delta api 并不是设计为总是获取所有文件的。推荐的做法是只获取一次所有文件,在本地缓存获取数据,在后续只进行增量更新。我们要实现这个缓存和增量更新机制吗?我对存储这方面不太了解,是要放在 OneDrive 的 App root 里面,还是放在 IndexedDB 之类的地方?
  2. 在点击播放按钮时静默进行这个请求,在用户体验上极其糟糕。需要额外的视觉反馈,或者其它良好设计。

@nini22P
Copy link
Owner

nini22P commented Aug 17, 2025

后面我会尝试用这个 /delta api 构建媒体库

@nini22P
Copy link
Owner

nini22P commented Aug 18, 2025

鉴于 /search api 无法胜任这个任务,我参考大规模发现文件和检测更改的最佳做法,使用 /delta api 获取所有子文件夹中的文件。该 api 可以准确获取某个路径下的所有文件,并且可以返回完整的结果。我编写了一个粗糙的实验性的实现,在我的具有 2000+ 音频文件和大量子文件夹的文件夹中,它似乎是工作正确的(包括子文件夹本身在内,总共返回了 6000+ 项结果,扫了一眼应该都在指定目录下,没有详细确认)。

我觉得这条路是可行的。目前仍有如下问题:

  1. /delta api 并不是设计为总是获取所有文件的。推荐的做法是只获取一次所有文件,在本地缓存获取数据,在后续只进行增量更新。我们要实现这个缓存和增量更新机制吗?我对存储这方面不太了解,是要放在 OneDrive 的 App root 里面,还是放在 IndexedDB 之类的地方?
  2. 在点击播放按钮时静默进行这个请求,在用户体验上极其糟糕。需要额外的视觉反馈,或者其它良好设计。

按照 /delta api 的推荐做法最好是获取整个 OneDrive 目录或者某个特定文件夹,这样只需维护一份 delta_link,在应用启动后获取文件结构,然后将目录结构存储在 IndexedDB 中。

@nini22P nini22P changed the base branch from main to dev August 18, 2025 04:58
@chenxiex
Copy link
Author

我刚刚推送了一个简单的版本,实现了 /delta api 相关的获取、缓存和更新,对每一个路径维护一份缓存和一份 delta_link。

至于如何利用这个 /delta api,我先偷懒写了一个在随机播放时获取,细究起来我觉得使用独立的媒体库页面是比较理想的。在媒体库中可以添加特定文件夹为媒体库,然后就针对这些文件夹进行缓存,更新的话可以启动时自动更新,也可以用户手动更新。

@nini22P nini22P merged commit 125e07a into nini22P:dev Aug 19, 2025
4 checks passed
@chenxiex chenxiex deleted the play-all branch August 26, 2025 07:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants