一个用于自动整理相机拍摄文件的Python Web应用,支持按文件元信息创建自定义文件夹层级,并提供时间轴、相册、地图视图和文件管理功能。
- 时间轴视图:按拍摄时间展示媒体文件,支持时间范围筛选
- 相册文件夹:树形结构展示文件夹层级,支持文件浏览
- 地图视图:在全球地图上展示带有地理信息的媒体文件
- 任务管理:支持文件夹扫描和连拍检测等自动化任务
- 自定义文件夹规则:根据GPS地点、时间、文件类型等创建自定义文件夹结构
- 后端:Flask + SQLite
- 前端:Vue.js + Element Plus
- 文件处理:ExifRead, Pillow
- 地图:Leaflet/OpenStreetMap
前端 (Vue.js)
↓ (REST API)
后端 (Flask)
↓
业务逻辑层 (文件扫描、元数据提取、文件整理)
↓
数据访问层 (SQLite)
↓
文件系统 (本地存储)
- Python 3.8+
- Node.js 14+
- 足够的存储空间
- 克隆项目代码
git clone [项目仓库地址]
cd GeoGallery- 安装Python依赖
pip install -r requirements.txt- 安装前端依赖
npm install- 构建前端项目
npm run build- 启动后端服务
python app.py- 访问应用
在浏览器中访问:http://localhost:5001
- 按拍摄时间倒序展示所有媒体文件
- 支持按年/月/日筛选时间范围
- 支持按文件类型筛选(图片/视频)
- 点击缩略图可查看大图或播放视频
- 树形结构展示文件夹层级
- 显示每个文件夹中的文件数量
- 支持文件夹预览图
- 面包屑导航便于返回上级文件夹
- 使用Leaflet地图显示媒体文件的地理位置
- 聚类标记显示同一位置的多个文件
- 支持地图缩放和位置搜索
- 点击标记可预览对应媒体文件
- 配置源路径和目标路径
- 自定义文件夹层级规则
- 选择需要处理的文件类型
- 实时显示任务进度
- 自动识别连拍图片组
- 根据文件名模式和时间间隔进行分组
- 支持手动调整分组结果
支持以下规则类型的组合:
- GPS地点名称:从文件元数据提取地理位置信息
- 时间维度:年、月、日、时
- 文件类型:根据文件扩展名分类
- 自定义文本:添加固定的文件夹名称
| 字段 | 类型 | 描述 |
|---|---|---|
| id | INTEGER | 主键 |
| key | TEXT | 配置键名 |
| value | TEXT | 配置值 |
| description | TEXT | 配置描述 |
| 字段 | 类型 | 描述 |
|---|---|---|
| id | INTEGER | 主键 |
| filename | TEXT | 文件名 |
| filepath | TEXT | 文件路径 |
| filesize | INTEGER | 文件大小(字节) |
| filetype | TEXT | 文件类型 |
| create_time | DATETIME | 创建时间 |
| modify_time | DATETIME | 修改时间 |
| capture_time | DATETIME | 拍摄时间 |
| latitude | REAL | 纬度 |
| longitude | REAL | 经度 |
| location_name | TEXT | 位置名称 |
| album_id | INTEGER | 所属相册ID |
| is_burst | BOOLEAN | 是否连拍 |
| burst_group_id | INTEGER | 连拍组ID |
| 字段 | 类型 | 描述 |
|---|---|---|
| id | INTEGER | 主键 |
| task_type | TEXT | 任务类型(scan/burst) |
| status | TEXT | 任务状态 |
| progress | INTEGER | 进度(0-100) |
| config_json | TEXT | 任务配置JSON |
| source_path | TEXT | 源路径 |
| target_path | TEXT | 目标路径 |
| created_time | DATETIME | 创建时间 |
| completed_time | DATETIME | 完成时间 |
| 字段 | 类型 | 描述 |
|---|---|---|
| id | INTEGER | 主键 |
| name | TEXT | 相册名称 |
| path | TEXT | 相册路径 |
| parent_id | INTEGER | 父相册ID |
| level | INTEGER | 层级 |
GET /api/media/files?start_date=&end_date=- 获取媒体文件列表GET /api/media/albums- 获取相册列表GET /api/media/albums/:id/files- 获取指定相册文件GET /api/media/locations- 获取地理位置数据
POST /api/tasks/scan- 创建扫描任务POST /api/tasks/burst- 创建连拍检测任务GET /api/tasks- 获取任务列表GET /api/tasks/:id/progress- 获取任务进度
GET /api/config/folder-rules- 获取文件夹规则配置POST /api/config/folder-rules- 更新文件夹规则配置
# 启动开发服务器(端口3000)
npm run dev# 启动开发服务器(端口5001)
python app.py --debug- 首次使用时,建议先扫描一个测试文件夹
- 文件整理操作会创建大量文件夹,请确保目标磁盘有足够空间
- 连拍检测功能目前基于文件名和时间间隔,可能需要手动调整结果
- 地图功能需要网络连接以加载地图瓦片
MIT
如有问题或建议,请联系:[项目维护者邮箱]