dogsheep-photos 由 dogsheep 开发

星标

README 源代码

dogsheep-photos

PyPI Changelog CircleCI License

将你的照片详情保存到 SQLite 数据库并上传到 S3。

请参阅 使用 SQL 根据 Apple Photos 查找我最好的一张鹈鹕照片,了解有关此项目的背景信息。

这些工具的作用

这些工具是一个正在开发中的机制,旨在帮助你完全拥有你的照片。其核心思想是帮助实现以下目标:

  • 你拍摄的每张照片都存储在一个单一的私有 Amazon S3 存储桶中
  • 你拥有一个单独的 SQLite 数据库文件,用于存储这些照片的元数据 - 这些数据可能来自多个不同的地方。这可能包括 EXIF 数据、Apple Photos 数据、对照片运行机器学习 API 的结果等等。
  • 然后你可以使用 Datasette 来浏览你自己的照片。

我是 Apple Photos 的重度用户,因此此工具的初始版本会偏向于此,但理想情况下,我希望这些工具的子集对无论使用哪种核心照片解决方案的人都有用。

安装

$ pip install dogsheep-photos

身份验证(如果使用 S3)

如果你想使用 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 命令从你的 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%'"

使用 datasette-media 在本地提供照片

如果你不想将照片上传到 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-json-html 显示图像

如果你使用 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

{% endfor %}
">
<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>

random-photos.html

{% endfor %}
">
<h1>Random photosh1>

<div>
{% for photo in sql("with foo as (select * from apple_photos order by date desc limit 5000) select * from foo order by random() limit 20") %}
    <img src="/-/media/photo/{{ photo['uuid'] }}">
{% endfor %}
div>

现在像这样运行 Datasette

$ datasette photos.db -m metadata.yaml --template-dir=templates/

访问 http://localhost:8001/recent-photos 将显示 20 张最近的照片。访问 http://localhost:8001/random-photos 将显示从你最近的 5,000 张照片中随机选择的 20 张照片。