我们想要查询osu Lazer的谱面添加时间怎么办?
你可能会说找到谱面对应的文件夹的创建时间就好了。
很遗憾,这一招目前在Lazer行不通了。目前osu!lazer 完全重写了底层的文件存储系统。为了节省空间和提高加载速度,lazer 不再将每张图放在一个单独的、人类可读的文件夹里,而是把所有文件(音频、图片、谱面数据)打散并用哈希值(Hash)加密存储在了一个统一的数据库中这就意味着你不能够通过查询到谱面所对应的文件夹进而知道你添加的时间。
实际上,系统肯定记录了这些时间,因而我们才可以按添加时间、最近游玩时间进行排序。所以我们怎么能够得知这些时间呢?
答案是使用Realm Studio查询数据库文件
Lazer 的所有本地存储机制都依赖于 Realm 数据库。你所有的谱面导入时间、最近游玩时间,都精确记录在里面。我们可以直接把底层数据扒出来:
1. 定位数据库文件:
在你的电脑里找到 lazer 的数据目录,默认路径是:
C:\Users\你的用户名\AppData\Roaming\osu\client.realm
即:%UserProfile%\AppData\Roaming\osu\client.realm
为了保证数据安全,不建议直接对文件进行任何操作,你可以把这个文件拷贝到其他路径。
2. 安装查询工具MongoDB Realm Studio
在GitHub Release界面可以下载:https://github.com/realm/realm-studio/releases/latest
3. 查询下载时间
方法一:使用 OnlineID 查询(最精准、最推荐)
每一张从官网下载的图,都会带有一个 OnlineID,这个 ID 就是官网网页链接里的那串数字。
去官网找到那张图,比如网址是 https://osu.ppy.sh/beatmapsets/2478377#osu/5436050,那么 2478377 就是谱面集的 OnlineID,而 5436050 就是各难度谱面的OnlineID
在 Realm Studio 左侧选中 BeatmapSet 表。
在顶部的搜索框中输入以下查询语句并回车:
OnlineID == 2478377
结果会瞬间过滤出唯一的一行数据,向右滚动找到 DateAdded 字段即可看到精确的导入时间。
时间解读
比如 2024-12-12T13:16:29.624Z 采用的是标准的 ISO 8601 时间格式:
日期: 2024年12月12日
时间: 13点16分29秒(小数点后的 624 是毫秒)
时区: 结尾的字母 Z 代表这是 UTC(协调世界时)零时区的时间。
方法二:直接用歌名/歌手查
如果你不想去官网翻 ID,想直接搜歌名。从数据库结构可以看到,歌曲的罗马音、Unicode标题和艺术家信息被嵌在 Beatmap 表的 Metadata 列里。因为你要的下载时间是在 BeatmapSet 表里,我们需要通过关联语法来搜:
依然在左侧选中 BeatmapSet。
顶部搜索框:
- 对于罗马音、拼音、英文歌曲名
Beatmaps.Metadata.Title CONTAINS[c] "歌曲名字"
Beatmaps.Metadata.Artist CONTAINS[c] "作者名"
把引号里的词换成你想搜的歌名、歌手名的罗马音即可,[c]代表不区分大小写。
比如 Beatmaps.Metadata.Title CONTAINS[c] "Hitorigoto"
Beatmaps.Metadata.Artist CONTAINS[c] "ClariS"
Hitorigoto ヒトリゴト 果然是osu名曲捏,单是谱面就有好几个版本。
- 对于中文、日文以及其他语言Unicode
查 Unicode 歌名:
如果你想搜《哀の隙間》,直接输入:
Beatmaps.Metadata.TitleUnicode CONTAINS[c] "哀の隙間"
查 Unicode 艺术家 (作者):
如果你想搜初音未来相关,直接输入:
Beatmaps.Metadata.ArtistUnicode CONTAINS[c] "初音ミク"
需要注意的是:可能谱师提交Unicode信息时候一样提交了罗马因、拼音、英文名等,这样你可能会查询不到。
按回车后,同样看 DateAdded 列 就能找到它的下载时间了。
4. 查询最后游玩时间
osu lazer针对谱面的每一种难度的最后游玩时间都有分别记录。
类似查询谱面下载时间,我们也是由两种方法,不过不同的是,谱面的每种难度的最后游玩时间保存在 Beatmap 表中。
方法一:OnlineID查询
类似的,不过这次我们需要你查询的难度的 OnlineID 比如上面的https://osu.ppy.sh/beatmapsets/2478377#osu/5436050 ,那么这次我们要 OnlineID == 5436050。
方法二: 直接用歌名/歌手查
同样的
如:Metadata.TitleUnicode CONTAINS[c] "哀の隙間"
Metadata.Title CONTAINS[c] "Ai no sukima"
其他信息
通过观察,我也可以看到数据库中保存的其他信息。
比如BeatmapMetadata包含谱面元信息,如 标题、艺术家、谱面作者、歌曲来源、tag、用户tag(跳图、切指等
BeatmapSet包括谱面集的rank时间、上传时间。
Beatmap包含各难度的谱面的BPM、长度、难度星数、OD和CS等属性