将你的照片详情保存到 SQLite 数据库并上传到 S3。
请参阅 使用 SQL 根据 Apple Photos 查找我最好的一张鹈鹕照片,了解有关此项目的背景信息。
这些工具是一个正在开发中的机制,旨在帮助你完全拥有你的照片。其核心思想是帮助实现以下目标:
- 你拍摄的每张照片都存储在一个单一的私有 Amazon S3 存储桶中
- 你拥有一个单独的 SQLite 数据库文件,用于存储这些照片的元数据 - 这些数据可能来自多个不同的地方。这可能包括 EXIF 数据、Apple Photos 数据、对照片运行机器学习 API 的结果等等。
- 然后你可以使用 Datasette 来浏览你自己的照片。
我是 Apple Photos 的重度用户,因此此工具的初始版本会偏向于此,但理想情况下,我希望这些工具的子集对无论使用哪种核心照片解决方案的人都有用。
$ pip install dogsheep-photos
如果你想使用 S3 存储照片,你需要首先为一个新的专用存储桶创建 S3 凭证。
你可能会发现 s3-credentials 工具对此有所帮助。
运行此命令并粘贴你的凭证。你需要三个值:S3 存储桶的名称、你的 Access key ID 和你的 Secret access key。
$ dogsheep-photos s3-auth
这将在当前目录中创建一个名为 auth.json
的文件,其中包含所需的值。要将文件保存到不同的路径或文件名,请使用 --auth=myauth.json
选项。
运行此命令将特定目录中的所有照片上传到你的 S3 存储桶
$ dogsheep-photos upload photos.db \
~/Pictures/Photos\ Library.photoslibrary/original
该命令只会上传尚未上传的照片,判断依据是它们的 sha256 哈希值。
将创建一个 photos.db
文件,其中包含一个 uploads
表,其中包含已上传文件的详细信息。
要在不上传任何文件的情况下查看命令将执行的操作,请使用 --dry-run
选项。
照片内容的 sha256 哈希值将用作存储桶中的文件名,并带有匹配文件类型的扩展名。这是对内容可寻址存储模式的一种实现。
apple-photos
命令从你的 Apple Photos 图库导入元数据。
$ photo-to-sqlite apple-photos photos.db
导入的元数据包括照片内容的地点、人物、相册、质量评分和机器学习标签。
你可以使用 create-subset
命令创建新的照片子集数据库。
这对于创建仅包含选定照片集元数据的可共享 SQLite 数据库很有用。
由于照片元数据包含经度和纬度,你可能不想共享包含在你家庭住址拍摄的照片的数据库。
create-subset
接受三个参数:一个使用 apple-photos
命令创建的现有数据库文件、你要创建的新可共享数据库文件的名称以及一个返回你希望包含在该数据库中的照片的 sha256
哈希值的 SQL 查询。
例如,以下是如何创建一个仅包含已添加到包含“Public”一词的相册中的照片的可共享数据库
$ dogsheep-photos create-subset \
photos.db \
public.db \
"select sha256 from apple_photos where albums like '%Public%'"
如果你不想将照片上传到 S3,但仍想使用 Datasette 浏览它们,你可以使用 datasette-media 插件来实现。此插件增加了直接从磁盘提供图像和其他静态文件的功能,并使用 SQL 查询进行配置。
要使用它,请首先安装 Datasette 和该插件
$ pip install datasette datasette-media
如果你的照片中包含 iPhone 拍摄的 .HEIC
格式图像,你还应该安装可选的 pyheif
依赖项
$ pip install pyheif
现在创建一个 metadata.yaml
文件来配置该插件
plugins:
datasette-media:
thumbnail:
sql: |-
select path as filepath, 200 as resize_height from apple_photos where uuid = :key
large:
sql: |-
select path as filepath, 1024 as resize_height from apple_photos where uuid = :key
这将配置两个 URL 端点 - 一个用于 200 像素高的缩略图,另一个用于 1024 像素高的较大图像。
使用 apple-photos
命令创建 photos.db
数据库,然后像这样运行 Datasette
$ datasette -m metadata.yaml
你的照片将通过如下所示的 URL 提供服务
http://127.0.0.1:8001/-/media/thumbnail/F4469918-13F3-43D8-9EC1-734C0E6B60AD
http://127.0.0.1:8001/-/media/large/F4469918-13F3-43D8-9EC1-734C0E6B60AD
通过运行 select uuid from photos_with_apple_metadata
,你可以找到这些 URL 中使用的 UUID。
如果你使用 datasette-media
提供照片,你可以使用 datasette-json-html 插件将图像直接包含在 Datasette 查询结果中。
运行 pip install datasette-json-html
安装插件,然后使用如下查询来查看你的图像
select
json_object(
'img_src',
'/-/media/thumbnail/' || uuid
) as photo,
uuid,
date
from
apple_photos
order by
date desc
limit 10;
此查询返回的 photo
列应呈现为显示正确图像的图像标签。
Datasette 的自定义页面功能允许你通过将 HTML 模板放入 templates/pages
目录,然后使用 datasette --template-dir=templates/
运行 Datasette 来创建 Datasette 实例的自定义页面。
你可以将此功能与 datasette-template-sql 插件结合使用,创建直接显示由 datasette-media
提供的照片的自定义模板页面。
使用 pip install datasette-template-sql
安装插件。
创建一个 templates/pages
文件夹并添加以下文件
recent-photos.html
<h1>Recent photosh1> <div> {% for photo in sql("select * from apple_photos order by date desc limit 20") %} <img src="/-/media/photo/{{ photo['uuid'] }}"> {% endfor %} div>