# 批量内容导入器

该工具允许通过解析文件系统文件夹的内容,将图片、相册和用户批量导入到基于 Chevereto 的网站中。当你想导入大量的内容时,可以使用它,不然使用 API 或 web gui 导入会很麻烦

导入 != 同步

导入:从导入路径中获取内容,并将其导入到数据库、文件系统或外部存储中,完成后,会从导入路径中删除文件

# 使用方法

进入 仪表盘/批量导入,在那里你可以添加和管理导入作业

权限

确定 PHP 程序对该文件路径有可读写权限。请确保 www-data (或您的具体用户,比如宝塔面板的 www 用户)拥有目标导入文件夹读写权限

# 解析格式

批量导入器会扫描目标导入目录,并创建相应的内容解析规则,如下所述。用户资产(头像、背景图片)将被上传到系统用户文件夹。

提示

只有在用户和相册不存在的情况下,解析器才会创建这些用户和相册。它会检测 用户名 是否存在,对相册也会做同样的检测(根据相册名称 + 其所有者)

# 顶层文件夹为用户名

导入路径中的顶级文件夹将作为 用户名 处理。二级文件夹将被解析为 相册名

./<path>
└── rodolfo <- 用户名
    ├── weapons <- 相册名称
    │   ├── machine-gun.jpg
    │   └── rocket-launcher.jpg
    └── logo-alt.png

对于上面的文件目录树,解析器将:

  • 创建 rodolfo 用户(如果用户不存在)
  • rodolfo 用户下创建相册 weapons(如果相册不存在)
  • ./<path>/rodolfo/weapons 中的图片上传到 rodolfo 的 weapons 相册
  • logo-alt.png 上传到 rodolfo(无相册名)

# 顶层文件夹为相册

导入路径内的顶层文件夹将作为 相册名称 处理

./<path>
└── weapons <- 相册名称
    ├── machine-gun.jpg
    ├── rocket-launcher.jpg
    └── logo-alt.png

对于上面的文件目录树,解析器将:

  • 以访客用户身份创建相册 weapons(如果相册不存在)
  • ./<path>/weapons 中的图像上传到 weapons 相册

# 不解析文件夹

不解析任何文件夹,只将图片以访客身份导入

./<path>
├── machine-gun.jpg
├── rocket-launcher.jpg
└── logo-alt.png

对于上面的文件目录树,解析器将:

  • 以访客用户身份将 ./<path> 中的图片上传到系统

# 自动导入

自动导入是通过检测 importing/ 路径下所有文件来执行任务的。在这个路径中,你会看到遵循给定解析格式的文件夹。只需按照格式将内容添加到这个文件夹中即可

路径 解析方式
./importing/parse-users 顶层文件夹为用户名 (opens new window)
./importing/parse-albums 顶层文件夹为相册 (opens new window)
./importing/no-parse 不解析文件夹 (opens new window)

# Cron 表达式

自动导入是通过计划命令来处理的,在 仪表盘/批量导入 处,你会看到一个 Cron (opens new window) 表达式,如下所示:

* * * * * IS_CRON=1 THREAD_ID=1 /usr/bin/php /public_html/importing.php >/dev/null 2>&1

上面的 Cron 表达式表示每分钟运行一次导入器,并带有 THREAD_ID=1 标志。

请向您的服务器管理员咨询如何在您的服务器上添加这个代码

# 性能优化

您可以通过在多个线程中运行导入来加快此过程。只需添加更多 cron 表达式:

* * * * * IS_CRON=1 THREAD_ID=1 /usr/bin/php /public_html/importing.php >/dev/null 2>&1
* * * * * IS_CRON=1 THREAD_ID=2 /usr/bin/php /public_html/importing.php >/dev/null 2>&1

只要你的硬件配置跟得上,想添加多少就多少!

# 锁定

你可以在 ./importing/.lock 路径下添加一个 .lock 空文件,可以锁定自动导入功能,在此文件删除之前,不会执行自动导入程序。

# 手动导入

手动导入的工作方式是创建一次性任务,该任务将在您选择的文件系统路径并用你选择的解析方式执行。

权限

确定 PHP 程序对该文件路径有可读写权限。请确保 www-data (或您的具体用户,比如宝塔面板的 www 用户)拥有目标导入文件夹读写权限

添加导入作业后,点击 "操作" 菜单下的 "处理"。使其工作状态变为 "工作"

注意

手动导入是靠浏览器 JavaScript 执行的,这意味着你必须保持网页浏览器的活动状态来进行这个过程。别担心,这个过程可以在任何时候暂停/恢复

# 状态

导入工作的状态定义如下:

状态 描述
Queued(队列中) 作业处于处理队列中(默认状态)
Working(工作中) 作业正在解析中
Paused(已暂停) 作业暂停
Canceled(已取消) 用户中止的作业
Completed(已完成) 工作完成(所有内容已解析)

提示

自动导入可能会在没有其他需要解析任务的情况下显示 "已完成",当它检测到要被解析的内容时,它会自动重新进入队列

# 元数据

批量导入程序支持使用 JSON 格式的元数据(描述其他数据的数据),与 Google Photos (opens new window). 相同

必须为每个内容提供元数据,这意味着您必须为每个内容使用一个元数据文件。

Content Type Metadata file
rodolfo/ username rodolfo/metadata.json
rodolfo/weapons/ album rodolfo/weapons/metadata.json
rodolfo/weapons/machine-gun.jpg image rodolfo/weapons/machine-gun.json
rodolfo/weapons/rocket-launcher.jpg image rodolfo/weapons/rocket-launcher.json
rodolfo/logo-alt.png image rodolfo/logo-alt.json

下面的树显示了上面表格的元数据。

./<path>
└── rodolfo
    ├── weapons
    │   ├── machine-gun.jpg
    │   ├── machine-gun.json
    │   ├── rocket-launcher.jpg
    │   ├── rocket-launcher.json
    │   └── metadata.json
    ├── logo-alt.png
    ├── logo-alt.json
    └── metadata.json

注意事项

元数据属性合并了被解析的内容,也就是说,你不需要明确指出所有的属性,只需要描述你需要的内容

# 图片元数据

以下 JSON 元数据文件提供了 Machine-Gun.jpg 的元数据示例:

{
    "imageData": {
        "title": "Machine gun",
        "description": "Say hello to my little friend!",
        "nsfw": false,
        "category": {
            "name": "Guns",
            "urlKey": "Guns",
            "description": "Guns don't kill people, sugar does."
        }
    }
}

图片分类

只要你同时提供 nameurlKey,就会根据需要创建图片分类

# 相册元数据

以下 JSON 元数据文件提供了 guns/ 相册的元数据示例:

{
    "albumData": {
        "title": "Guns",
        "description": "Guns should be banned.",
        "access": "private",
        "privacy": {
            "type": "password",
            "password": "12345"
        }
    }
}

对于相册的私密性,你可以选择:

隐私类型 影响
public 公共相册,访客开放 (默认)
private 私有相册,仅所有者可访问
private_but_link 和私有相册一样,但任何人都可以通过链接访问
password 将设置相册的访问密码

例如,如果你需要设置为 private_but_link,元数据属性应该是这样的:

{
    "privacy": {
        "type": "private_but_link"
    }
}

# 用户元数据

下面的 JSON 元数据文件提供了一个 rodolfo/ 用户的元数据示例:

{
    "userData": {
        "role": "user",
        "name": "Rodolfo Berrios",
        "username": "rodolfo",
        "email": "rodolfo@chevereto.com",
        "website": "https://rodolfoberrios.com",
        "bio": "I'm the Master of Puppets @chevereto, the alpha-omega. He/Him/They.",
        "profileImages": {
            "avatar": "rodo-avatar.jpg",
            "background": "rodo-bkg.jpg"
        },
        "networks": {
            "facebook": "no!",
            "twitter": "godlike"
        },
        "timezone": "America/Santiago",
        "language": "cl",
        "private": false
    }
}

资料图片必须位于用户文件夹内的 .assets/ 文件夹中

./<path>
└── rodolfo
    └── .assets
        ├── rodo-avatar.jpg
        └── rodo-bkg.jpg

用户资料

用户资料图片的文件类型必须是您启用的图像文件格式之一

# 查看日志

整个导入过程会被记录在位于 /app/import/jobs/<id>/logs/ 的文本文件中。您可以跟踪 process.txterror.txt 来获取导入过程的实时状态。你也可以通过点击 "操作 "菜单来访问这些日志。

# 从 Google Photos 导入

使用的元数据格式与 Google Photos 使用的完全相同,这意味着您可以摆脱该专有服务,开始拥有您的照片。

  • 进入 Google Takeout (opens new window)
  • 选择 Google Photos 并按照流程操作
  • 在交付方式中,选择 通过电子邮件发送下载链接
  • 完成后,您将获得一个压缩文件
  • Takeout/Google Photos 文件夹重命名为目标用户名,例如:Takeout/Rodolfo

这里,你可以采取 自动导入手动导入 方式导入该文件夹下的内容

元数据

从 Chevereto V3.17 版本开始,可以识别所有的 Google Photos 元数据了