跳转到主要内容

将您照片的详细信息保存到SQLite数据库并上传到S3

项目描述

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存储桶名称、访问密钥ID和秘密访问密钥。

$ dogsheep-photos s3-auth

这将在您的当前目录中创建一个名为auth.json的文件,包含所需值。要保存文件到不同的路径或文件名,请使用--auth=myauth.json选项。

上传照片

运行此命令将特定目录中的所有照片上传到您的S3存储桶

$ dogsheep-photos upload photos.db \
    ~/Pictures/Photos\ Library.photoslibrary/original

该命令仅上传尚未上传的照片,根据其sha256哈希值。

将创建一个包含已上传文件详细信息的uploads表的photos.db

要在不上传任何文件的情况下查看命令会做什么,请使用--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的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使用datasette --template-dir=templates/运行来为Datasette实例创建自定义页面。

您可以将此功能与datasette-template-sql插件结合起来,以创建直接显示由datasette-media提供的照片的自定义模板页面。

使用pip install datasette-template-sql安装插件。

创建一个templates/pages文件夹并添加以下文件

recent-photos.html

<h1>Recent photos</h1>

<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

<h1>Random photos</h1>

<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 将显示从您最近5000张照片中随机选择的20张。

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于 安装包 的信息。

源代码分发

此版本没有可用的源代码分发文件。请参阅 生成分发存档 的教程。

构建分发

dogsheep_photos-0.4.1-py3-none-any.whl (14.6 kB 查看哈希值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面