# Afilmory Builder

这是照片库构建系统的核心模块，采用模块化设计，将不同功能分离到各自的模块中。

## 架构概览

```
src/core/
├── types/          # 类型定义
│   └── photo.ts    # 照片相关类型
├── logger/         # 日志系统
│   └── index.ts    # 统一日志器
├── s3/             # S3 存储操作
│   ├── client.ts   # S3 客户端配置
│   └── operations.ts # S3 操作（上传、下载、列表）
├── image/          # 图像处理
│   ├── processor.ts # 图像预处理和元数据
│   ├── blurhash.ts # Blurhash 生成
│   ├── thumbnail.ts # 缩略图生成
│   └── exif.ts     # EXIF 数据提取
├── photo/          # 照片处理
│   ├── info-extractor.ts # 照片信息提取
│   ├── processor.ts # 照片处理主逻辑
│   └── geocoding.ts # 反向地理编码
├── manifest/       # Manifest 管理
│   └── manager.ts  # Manifest 读写和管理
├── worker/         # 并发处理
│   └── pool.ts     # Worker 池管理
├── builder/        # 主构建器
│   └── index.ts    # 构建流程编排
└── index.ts        # 模块入口
```

## 模块说明

### 1. 类型定义 (`types/`)

- `PhotoInfo`: 照片基本信息
- `ImageMetadata`: 图像元数据
- `PhotoManifestItem`: Manifest 项目
- `ProcessPhotoResult`: 处理结果
- `ThumbnailResult`: 缩略图生成结果

### 2. 日志系统 (`logger/`)

- 统一的日志管理
- 支持不同模块的标签化日志
- Worker 专用日志器

### 3. S3 存储操作 (`s3/`)

- **client.ts**: S3 客户端配置和连接
- **operations.ts**: 图片下载、列表获取、URL 生成

### 4. 图像处理 (`image/`)

- **processor.ts**: 图像预处理、HEIC 转换、元数据提取
- **blurhash.ts**: Blurhash 生成算法
- **thumbnail.ts**: 缩略图生成和管理
- **exif.ts**: EXIF 数据提取和清理

### 5. 照片处理 (`photo/`)

- **info-extractor.ts**: 从文件名和 EXIF 提取照片信息
- **processor.ts**: 照片处理主流程，整合所有处理步骤
- **geocoding.ts**: 反向地理编码，支持 Mapbox 和 Nominatim 提供者

### 6. Manifest 管理 (`manifest/`)

- **manager.ts**: Manifest 文件的读取、保存、更新检测

### 7. 并发处理 (`worker/`)

- **pool.ts**: Worker 池管理，支持并发处理

### 8. 主构建器 (`builder/`)

- **index.ts**: 整个构建流程的编排和协调

## 使用方式

### 基本使用

```typescript
import { buildManifest } from './src/core/index.js'

await buildManifest({
  isForceMode: false,
  isForceManifest: false,
  isForceThumbnails: false,
  concurrencyLimit: 10,
})
```

### 单独使用模块

```typescript
import { getImageFromS3, generateThumbnailAndBlurhash, extractExifData } from './src/core/index.js'

// 下载图片
const buffer = await getImageFromS3('path/to/image.jpg')

// 生成缩略图
const result = await generateThumbnailAndBlurhash(buffer, 'photo-id', 1920, 1080)

// 提取 EXIF
const exif = await extractExifData(buffer)
```

## 特性

### 1. 模块化设计

- 每个功能模块独立，便于测试和维护
- 清晰的依赖关系
- 易于扩展新功能

### 2. 类型安全

- 完整的 TypeScript 类型定义
- 编译时错误检查

### 3. 性能优化

- Worker 池并发处理
- Sharp 实例复用
- 增量更新支持

### 4. 错误处理

- 统一的错误处理机制
- 详细的日志记录
- 优雅的失败处理

### 5. 配置灵活

- 支持多种运行模式
- 可配置的并发数
- 环境变量配置

### 6. 地理编码支持

- 从 GPS 坐标提取位置信息
- 支持 Mapbox 和 Nominatim 两种提供者
- 智能缓存和速率限制
- 自动重试和并发安全

## 扩展指南

### 添加新的图像处理功能

1. 在 `image/` 目录下创建新模块
2. 在 `index.ts` 中导出新功能
3. 在 `photo/processor.ts` 中集成

### 添加新的存储后端

1. 在 `s3/` 目录下创建新的操作模块
2. 实现相同的接口
3. 在配置中切换

### 自定义日志器

```typescript
import { logger } from './src/core/index.js'

const customLogger = logger.worker(1).withTag('CUSTOM')
customLogger.info('自定义日志')
```

## 性能考虑

- 使用 Worker 池避免过度并发
- Sharp 实例复用减少内存开销
- 增量更新减少不必要的处理
- 缩略图和 Blurhash 缓存复用
