datasette-media 作者 simonw

加星

README 源代码

datasette-media

PyPI Changelog Tests License

一个 Datasette 插件,用于基于 SQL 查询提供媒体文件。

当你的数据库表包含指向磁盘文件的引用,或存储在 BLOB 列中的二进制内容时,可以使用此插件将其提供给用户。

安装

在与 Datasette 相同的环境中安装此插件。

$ pip install datasette-media

HEIC 图像支持

现代 iPhone 使用 HEIC 图像格式保存照片。处理这些图像需要额外的依赖项 pyheif。你可以通过运行以下命令包含此依赖项:

$ pip install datasette-media[heif]

用法

你可以使用此插件配置 Datasette,使其能够基于对底层数据库表的 SQL 查询来提供静态媒体文件。

媒体文件将通过以 /-/media/ 开头的 URL 提供。每个媒体资产的完整 URL 将如下所示:

/-/media/type-of-media/media-key

type-of-media 将对应于已配置的 SQL 查询,可能类似于 photomedia-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,了解一个可以从本插件中受益的应用示例。

从 BLOB 列提供二进制内容

如果你的 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

从 URL 代理提供内容

要提供从其他地方获取的内容,请返回一个 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 - 要使用的输出格式(例如 jpegpng) - Pillow 支持的任何输出格式都允许在这里使用。

如果你指定了 resize_widthresize_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
        }
    }
}