文件
edu-content/sources/SCHEMA.md

67 行
2.6 KiB
Markdown

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# sources/ — L1 资源清单(全库唯一锚点)
`sources/` 回答:**数据从哪来、什么 license、原始文件在 OSS 哪里**。任何原始文件(PDF/ZIP/MP3/原始 JSON)进 OSS 前,必须在此先登记。
## 文件组织
- 一个 YAML 文件 = 一个**域**,内含多条 `source`。
- 域分三类目录:`china/`(国内课内 + 开源数据集)、`exams/`(考试来源)、`internal/`(自制无来源课件)。
- 文件名用 kebab-case,如 `cepoc.yaml`、`cambridge-official.yaml`、`smartedu.yaml`。
## 两级结构
```
source(引用单位,血缘根 id)
└─ items[](具体文件 = OSS 对象)
```
- L3 结构化记录引用 `source_id`(必填)+ 可选 `source_item_id`(精确到文件)。
- `internal` 类 source:`url: null`,`license: internal-only`,`oss_key` 指向归档对象。
## 字段(详见 `source.schema.json`)
| 字段 | 必填 | 说明 |
|---|---|---|
| `id` | ✅ | 全局唯一 kebab-case,血缘链根 id |
| `title` | ✅ | 人类可读 |
| `publisher` | ✅ | 发布方 |
| `type` | ✅ | `dataset`/`website`/`book`/`internal`/`tool` |
| `url` | ⚠️ | internal 可 null |
| `license` | ✅ | 见 `../LICENSES.md` 枚举 |
| `license_note` | ❌ | 许可说明(如"研究/教育用途") |
| `fetch_method` | ❌ | `curl`/`git-clone`/`manual-download`/`manual-export`/`generated` |
| `status` | ✅ | `planned`→`fetching`→`fetched`/`failed`;`archived` 保留合规记录 |
| `fetched_at` | ❌ | 下载日期 `YYYY-MM-DD` |
| `items[]` | ❌ | 具体文件,每项含 `id`/`title`/`oss_key`/`sha256`/`size`/`media_type`/`fetch_date` |
`items[].oss_key` 在 `fetched` 后必填;`sha256`/`size` 由 `tools/oss_sync.py` 上传时自动回填。
## 示例
```yaml
sources:
- id: cepoc
title: CEPOC 剑桥机读完形题库
publisher: Cambridge ALTA, University of Cambridge
type: dataset
url: https://github.com/CambridgeALTA/cepoc
license: cc-nc-education
license_note: "研究/教育用途,非商业(见仓库 licence.txt)"
fetch_method: git-clone
status: fetched
fetched_at: "2026-08-21"
items:
- id: cepoc-ket-json
title: KET.json(6套68空)
oss_key: edu-raw/exams/ket/questions/cepoc/KET.json
sha256: "a1b2c3..." # oss_sync.py 自动回填
size: 12345
media_type: application/json
fetch_date: "2026-08-21"
status: fetched
```
## 状态生命周期
`planned`(调研发现,未下载)→ `fetching` → `fetched`/`failed`。调研报告迁移时大量条目初始为 `planned`。`unknown` 状态超过 30 天 lint 报 warning。