用于处理 Apple 二进制 plist 格式的 Datasette 插件。
此插件增加了两个功能:一个显示钩子和一个 SQL 函数。
显示钩子将检测任何使用二进制 plist 格式编码的数据库值。它将解码这些值,将其转换为 JSON,并在 Datasette UI 中进行美观打印显示。
SQL 函数 bplist_to_json(value)
可以在 SQL 查询中使用,将二进制 plist 值转换为 JSON 字符串。然后,可以将其与 SQLite 的 json_extract()
函数或 datasette-jq 插件一起使用,作为 SQL 查询的一部分进一步分析该数据。
在与 Datasette 相同的环境中安装此插件即可启用此新功能
pip install datasette-bplist
如果您使用 Mac,您已经有很多包含二进制 plist 数据的 SQLite 数据库。
一个例子是驱动 Apple Photos 应用的数据库。
这个数据库通常是被锁定的,所以你需要创建数据库的副本才能对其运行查询
cp ~/Pictures/Photos\ Library.photoslibrary/database/photos.db /tmp/photos.db
该数据库还使用了自定义的 SQLite 扩展,这使得它无法在 Datasette 中打开。
你可以通过将想要实验的数据导出到一个新的 SQLite 文件来解决这个问题。
我建议针对 RKMaster_dataNote
表尝试此插件,该表包含您拍摄的照片的 plist 编码的 EXIF 元数据。
你可以将该表导出到一个新的数据库中,如下所示
sqlite3 /tmp/photos.db ".dump RKMaster_dataNote" | sqlite3 /tmp/exif.db
现在运行 datasette /tmp/exif.db
,你就可以开始尝试使用该插件了。
一旦 exif.db
演示运行正常,你就可以尝试使用 bplist_to_json()
SQL 函数了。
这是一个查询,显示了您最常用于拍照的相机镜头
select
json_extract(
bplist_to_json(value),
"$.{Exif}.LensModel"
) as lens,
count(*) as n
from RKMaster_dataNote
group by lens
order by n desc;
如果您的照片数量很大,此查询可能需要很长时间才能执行,因此您可能需要增加 Datasette 设置的 SQL 时间限制,如下所示
$ datasette /tmp/exif.db \
--config sql_time_limit_ms:10000
这是另一个查询,显示了您的照片库中所有被分类为截图的照片拍摄时间
select
attachedToId,
json_extract(
bplist_to_json(value),
"$.{Exif}.DateTimeOriginal"
)
from RKMaster_dataNote
where
json_extract(
bplist_to_json(value),
"$.{Exif}.UserComment"
) = "Screenshot"
如果您安装了 datasette-cluster-map 插件,此查询将显示您最近 1000 张照片的地图
select
*,
json_extract(
bplist_to_json(value),
"$.{GPS}.Latitude"
) as latitude,
-json_extract(
bplist_to_json(value),
"$.{GPS}.Longitude"
) as longitude,
json_extract(
bplist_to_json(value),
"$.{Exif}.DateTimeOriginal"
) as datetime
from
RKMaster_dataNote
where
latitude is not null
order by
attachedToId desc