一个 Datasette 插件,用于基于 SQL 查询提供媒体文件。
当你的数据库表包含指向磁盘文件的引用,或存储在 BLOB 列中的二进制内容时,可以使用此插件将其提供给用户。
在与 Datasette 相同的环境中安装此插件。
$ pip install datasette-media
现代 iPhone 使用 HEIC 图像格式保存照片。处理这些图像需要额外的依赖项 pyheif。你可以通过运行以下命令包含此依赖项:
$ pip install datasette-media[heif]
你可以使用此插件配置 Datasette,使其能够基于对底层数据库表的 SQL 查询来提供静态媒体文件。
媒体文件将通过以 /-/media/
开头的 URL 提供。每个媒体资产的完整 URL 将如下所示:
/-/media/type-of-media/media-key
type-of-media
将对应于已配置的 SQL 查询,可能类似于 photo
。media-key
将是一个标识符,作为底层 SQL 查询的一部分使用,用于查找应该提供哪个文件。
以下 metadata.json
配置将使此插件基于对名为 apple_photos
的数据库表的查询来提供磁盘文件。
{
"plugins": {
"datasette-media": {
"photo": {
"sql": "select filepath from apple_photos where uuid=:key"
}
}
}
}
对 /-/media/photo/CF972D33-5324-44F2-8DAE-22CB3182CD31
的请求将执行以下 SQL 查询:
select filepath from apple_photos where uuid=:key
来自 URL 的值(在本例中为 CF972D33-5324-44F2-8DAE-22CB3182CD31
)将作为 :key
参数传递给查询。
查询返回一个从表中读取的 filepath
值。插件将从磁盘读取该文件,并在响应请求时提供它。
SQL 查询默认针对第一个连接的数据库运行。你可以使用 "database": "name_of_db"
指定要执行查询的不同数据库。要针对 photos.db
执行,请使用此配置:
{
"plugins": {
"datasette-media": {
"photo": {
"sql": "select filepath from apple_photos where uuid=:key",
"database": "photos"
}
}
}
}
请参阅 dogsheep-photos,了解一个可以从本插件中受益的应用示例。
如果你的 SQL 查询返回一个 content
列,此内容将直接提供给用户:
{
"plugins": {
"datasette-media": {
"photo": {
"sql": "select thumbnail as content from photos where uuid=:key",
"database": "thumbs"
}
}
}
}
你还可以返回一个 content_type
列,该列将用作提供给用户的 Content-Type
头部:
{
"plugins": {
"datasette-media": {
"photo": {
"sql": "select body as content, 'text/html;charset=utf-8' as content_type from documents where id=:key",
"database": "documents"
}
}
}
}
如果你未指定 content_type
,将使用默认值 application/octet-stream
。
要提供从其他地方获取的内容,请返回一个 content_url
列。这与调整图像大小的功能结合使用时特别有用(下一节将介绍)。
{
"plugins": {
"datasette-media": {
"photos": {
"sql": "select photo_url as content_url from photos where id=:key",
"database": "photos",
"enable_transform": true
}
}
}
}
现在你可以通过该 URL 访问调整大小后的图像版本,如下所示:
/-/media/photos/13?w=200
可以返回 content_filename
列,以强制浏览器使用指定的文件名下载内容。
{
"plugins": {
"datasette-media": {
"hello": {
"sql": "select 'Hello ' || :key as content, 'hello.txt' as content_filename"
}
}
}
}
访问 /-/media/hello/Groot
将导致你的浏览器下载一个名为 hello.txt
的文件,其中包含文本 Hello Groot
。
你的 SQL 查询可以通过返回额外的列来指定图像应该调整大小和/或转换为另一种格式。这三个列都是可选的。
resize_width
- 图像调整后的宽度resize_height
- 图像调整后的高度output_format
- 要使用的输出格式(例如jpeg
或png
) - Pillow 支持的任何输出格式都允许在这里使用。
如果你指定了 resize_width
或 resize_height
中的一个而未指定另一个,未指定的那个将自动计算,以保持图像的宽高比。
这是一个示例配置,它将所有图像调整为高度为 200 像素的 JPEG 格式:
{
"plugins": {
"datasette-media": {
"photo": {
"sql": "select filepath, 200 as resize_height, 'jpeg' as output_format from apple_photos where uuid=:key",
"database": "photos"
}
}
}
}
如果你启用 enable_transform
配置选项,则可以改为在运行时使用查询字符串参数指定转换参数。例如:
/-/media/photo/CF972D33?w=200
将宽度调整为固定值/-/media/photo/CF972D33?h=200
将高度调整为固定值/-/media/photo/CF972D33?format=jpeg
转换为 JPEG 格式
该选项添加如下:
{
"plugins": {
"datasette-media": {
"photo": {
"sql": "select filepath from apple_photos where uuid=:key",
"database": "photos",
"enable_transform": true
}
}
}
}
允许的最大高度或宽度为 4000 像素。你可以使用 "max_width_height"
选项更改此限制:
{
"plugins": {
"datasette-media": {
"photo": {
"sql": "select filepath from apple_photos where uuid=:key",
"database": "photos",
"enable_transform": true,
"max_width_height": 1000
}
}
}
}
除了不同的命名内容类型,以下特殊的插件配置设置可用:
transform_threads
- 用于运行转换(例如调整大小)的线程数。默认为 4。
可以这样使用:
{
"plugins": {
"datasette-media": {
"photo": {
"sql": "select filepath from apple_photos where uuid=:key",
"database": "photos"
},
"transform_threads": 8
}
}
}