datasette-bplist 作者 simonw

收藏

README 源代码

datasette-bplist

PyPI CircleCI License

用于处理 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,你就可以开始尝试使用该插件了。

使用 bplist_to_json() SQL 函数

一旦 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