本项目旨在开发一个基于 Python 的后端服务,用于处理和浏览已有成型的文件夹结构中的图片和视频。项目采用前后端分离的架构,后端负责多媒体文件的处理、存储和提供相关数据接口。该服务特别针对通过文件夹结构组织的多媒体内容,方便用户通过目录层级进行管理和浏览。
- 编程语言: Python
- 数据库: SQLite
- 多媒体处理库: Pillow, pyheif(用于 HEIC 文件转换)
- Web 框架: FastAPI(推荐)
- 其他工具: SQLAlchemy(数据库交互)、ExifRead(读取 EXIF 信息)
后端服务支持以下主流图片和视频格式(扩展名不区分大小写):
- 图片:
.jpg,.jpeg,.png,.gif,.webp,.heic,.heif - 视频:
.mp4
对于 GIF 和 MP4 文件,将提取其第一帧作为预览图。
-
文件目录结构读取
- 遍历指定的媒体文件夹,读取其目录结构和多媒体文件。
-
数据库交互
- 使用 SQLite 数据库存储文件信息,包括文件路径、EXIF 数据(图片)、缩略图路径等。
-
缩略图生成
- 根据图片大小和配置生成缩略图,以优化前端展示性能。
- 新增: 对于 GIF 和 MP4 文件,提取第一帧作为缩略图。
-
EXIF 信息读取
- 读取并存储图片的 EXIF 元数据,供前端展示使用。
-
HEIC 文件处理
- 支持 HEIC 和 HEIF 格式的图片,自动转换为 JPEG 格式以便展示。
-
视频预览图生成
- 新增: 对于 MP4 和 GIF 文件,提取第一帧作为预览图。
-
缓存机制
- 建立缓存机制,减少重复计算和文件读取,提高性能。
graph TD
A[首次启动] --> B{是否存在数据库文件}
B --> |否| C(遍历文件夹)
C --> D(建立缓存.读取EXIF/提取首帧)
D --> E{是否为HEIC文件}
E --> |是| F(转换成原始大小的JPEG)
E --> |否| G(根据大小决定是否需要生成缩略图)
F --> G
G --> H(将数据写入数据库文件)
B --> |是| I[终止]
graph LR
A[打开文件夹] --> B(读取数据库文件夹内容)
B --> C(展示缩略图/视频首帧)
graph LR
A[点击大图/视频] --> B(读取数据库文件内容)
B --> C{是否为HEIC文件}
C --> |是| D(展示转换后的JPEG文件)
C --> |不是| E(展示原始的图片或视频文件)
-
folders
id(INTEGER, PRIMARY KEY)folder_path(TEXT, UNIQUE) # 相对路径name(TEXT) # 文件夹名称parent_id(INTEGER, FOREIGN KEY, 默认值为 NULL,根目录的父文件夹 ID 为 NULL) # 父文件夹IDcreated_at(TIMESTAMP)updated_at(TIMESTAMP)
-
images
id(INTEGER, PRIMARY KEY)file_path(TEXT, UNIQUE)folder_id(INTEGER, FOREIGN KEY, nullable=False) # 所属文件夹IDname(TEXT) # 文件名thumbnail_path(TEXT, nullable=True)exif_data(JSON, nullable=True)is_heic(BOOLEAN, default=False)converted_path(TEXT, nullable=True)image_type(TEXT, nullable=False) # original, converted, thumbnailparent_id(INTEGER, ForeignKey('images.id'), nullable=True) # 原图ID,用于关联转换图和缩略图。对于缩略图和转换后的 HEIC 图片,指向原始图片 ID。is_thumbnail(BOOLEAN, default=False) # 是否作为缩略图使用created_at(TIMESTAMP)updated_at(TIMESTAMP)
- 根目录的
parent_id为 NULL。 - 所有文件夹通过
parent_id形成树状结构。 - API 默认从根目录开始查询。
基于提供的 OpenAPI 文档,API 设计如下:
-
获取文件夹列表
- Endpoint:
/api/folders - Method:
GET - Description: 返回所有文件夹的列表及其相关信息。
- Endpoint:
-
获取指定文件夹的图片和视频
- Endpoint:
/api/folders/{folder_id}/images - Method:
GET - Description: 返回指定文件夹中所有图片和视频的缩略图(或视频首帧)及基本信息。
- Query 参数:
page: (可选) 页码,用于分页展示。
- Endpoint:
-
获取大图或视频
- Endpoint:
/api/images/{image_id} - Method:
GET - Description: 根据图片或视频 ID 返回其详细信息。
- Endpoint:
-
触发全盘扫描
- Endpoint:
/api/scan - Method:
POST - Description: 手动触发后台更新数据库的操作,用于全盘重新扫描。
- Endpoint:
-
根路径
- Endpoint:
/api/ - Method:
GET - Description: 根路径,可能用于健康检查或其他用途。
- Endpoint:
-
获取完整图片或视频
- Endpoint:
/api/images/{image_id}/full - Method:
GET - Description: 根据图片或视频 ID 返回原始文件或转换后的 JPEG 文件(针对 HEIC)。
- Endpoint:
-
获取子文件夹列表
- Endpoint:
/api/folders/{parent_id}/subfolders - Method:
GET - Description: 获取指定父文件夹下的所有子文件夹。
- Path 参数:
parent_id: 父文件夹 ID,可以为 NULL 以获取根目录下的文件夹。
- Endpoint:
- 框架: 配合后端使用,采用 Tailwind CSS。
- 设计要求:
- 简洁易用
- 响应式设计,便于移动端使用
- 支持中英文切换
- 功能集成:
- 展示文件夹列表
- 显示图片缩略图和视频预览图
- 支持点击缩略图查看大图或播放视频
- 404 Not Found: 图片、视频或文件夹不存在。
- 500 Internal Server Error: 服务器内部错误,如数据库连接失败、文件读取错误、媒体处理错误等。
- 400 Bad Request: 请求参数错误。
- 422 Unprocessable Entity: 请求数据验证失败。
- 异步处理: 使用异步 IO 处理文件读取和多媒体处理任务,提升响应速度。
- 批量操作: 批量读取和写入数据库,减少数据库交互次数。
- 缓存机制: 利用内存缓存或文件缓存,加快重复请求的响应速度。
- 缩略图优化: 合理设置缩略图尺寸,减少存储空间和网络传输。
- 输入验证: 对所有 API 输入进行严格验证,防止注入攻击。
- 权限控制: 不需要用户认证和权限管理,因为是私有项目。
- 数据备份: 定期备份 SQLite 数据库,防止数据丢失。
- 服务器要求: 支持 Python 运行环境,推荐使用 Linux 服务器。
- 依赖管理: 使用
requirements.txt管理 Python 依赖包。 - 容器化: 最终通过 Docker 容器进行部署(详细方案待后续讨论)。
- 监控和日志: 集成日志记录和监控工具,实时监控服务运行状态。
- 支持语言: 中文和英文。
- 实现方式: 后端提供多语言接口,前端根据用户选择切换语言。
- 尺寸: 固定大小(例如 200x200 像素)。
- 比例: 保持原图/视频的宽高比例,避免变形。
- 视频: 提取视频文件的第一帧作为缩略图。
- 全盘重新扫描:
- 触发方式: 手动触发通过
/api/scan或首次启动时自动触发。 - 流程: 遍历所有文件夹和多媒体文件,更新数据库和缓存。
- 触发方式: 手动触发通过
- 实时文件夹监控:
- 工具: 使用
watchdog库实现文件夹的实时监控。 - 功能: 监控文件夹内的新增、删除、修改事件,实时更新数据库和缓存。
- 工具: 使用
目前所有待确认事项已根据用户提供的信息进行了确认和更新。
虽然当前项目需求已明确,但未来可以考虑以下扩展功能:
- 用户认证与权限管理: 若项目公开或需要多用户访问时。
- 更多语言支持: 支持其他语言以适应更广泛的用户群体。
- 高级搜索与过滤: 根据 EXIF 数据、文件名、创建时间等进行搜索。
- 图像/视频编辑功能: 提供基本的图像编辑和批量处理工具,以及简单的视频信息展示。
- 在线视频播放: 集成视频播放器,支持直接在前端播放视频。