# Gbro Series Vocab

> 追剧学英语 / Learn English vocabulary from TV series. 用户给出剧名+集数（如「追剧学英语 Breaking Bad S02E03」），自动找该集字幕/剧本，提取 50 个词汇短语，生成 Anki 导入 CSV + Markdown 词汇笔记。触发词：「追剧学英语」「剧学英语」「series vocab」「learn english from」+ 剧名集数。仅处理英美剧单集，不处理 YouTube 视频或普通翻译请求。

- Skill: `pyang5166/gbro-series-vocab` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add pyang5166/gbro-series-vocab`
- Raw SKILL.md: https://api.skillmd.com/api/skills/pyang5166/gbro-series-vocab/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: pyang5166 (https://skillmd.com/u/pyang5166)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/pyang5166/gbro-series-vocab

---


# gbro-series-vocab · 追剧学英语

帮用户从一集英美剧中高效提取词汇，输出 Anki 闪卡 + Markdown 词汇笔记。

---

## 首次使用（配置）

skill 目录下没有 `config.md` 时，先问用户两个问题，答案写入 `config.md`，之后不再重复问：

1. **词汇笔记保存目录**：默认 `~/Documents/series-vocab/`；Obsidian/Logseq 用户可以填 vault 内的路径
2. **释义语言**：默认中文；其他母语用户可改（下文所有「中文释义/中文译句」按此替换为用户母语）

`config.md` 格式：

```markdown
notes_dir: ~/Documents/series-vocab/
native_language: 中文
```

---

## 输入解析

用户会说类似：`追剧学英语 Breaking Bad S02E03`

提取：
- **剧名**：英文名（如 Breaking Bad）
- **集数**：SxxExx 格式 → 解析为 season=2, episode=3

---

## 第一步：找字幕/剧本

按顺序尝试，找到即停止。

### 方法 A：Springfield Springfield（老剧首选）

slug 规则：剧名转小写，空格换连字符，**去掉所有非字母数字和连字符的字符**（撇号、冒号、逗号、句点等），连续连字符合并为一个。例如 `Grey's Anatomy` → `greys-anatomy`，`It's Always Sunny in Philadelphia` → `its-always-sunny-in-philadelphia`。

```bash
SHOW_SLUG=$(echo "Grey's Anatomy" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed -E 's/[^a-z0-9-]//g; s/-+/-/g')
curl -sL "https://r.jina.ai/https://www.springfieldspringfield.co.uk/view_episode_scripts.php?tv-show=${SHOW_SLUG}&episode=s02e03"
```

**判断成功（两条必须同时满足）**：
1. 页面标题含剧名（找不到该剧时网站返回的错误页标题只有集数没有剧名，且正文只剩导航链接，长度也可能上万字符——不要只看长度）
2. 正文含大量对话行（连续的口语句子），而非以 `[链接](url)` 为主的导航内容

**注意**：Springfield 已基本停更，2023 年后的新剧（如 The Pitt、Severance、White Lotus S3）都没有收录。方法 A 失败一次就果断转方法 B，不要反复试。

### 方法 B：subslikescript 站内搜索（新剧首选）

subslikescript 持续收录新剧，但直接 curl 会被 JS 验证码挡住，**每一步都必须经 r.jina.ai 抓取**。三步走：

```bash
# 1. 站内搜索，拿剧集页 URL（形如 /series/{Name}-{id}）
curl -sL "https://r.jina.ai/https://subslikescript.com/search?q={关键词}"

# 2. 抓剧集页，找目标集链接（形如 /series/{Name}-{id}/season-{s}/episode-{e}-{集标题}）
#    单集 URL 末尾带集标题，无法直接拼出，必须从剧集页拿
curl -sL "https://r.jina.ai/https://subslikescript.com/series/{Name}-{id}"

# 3. 抓单集正文
curl -sL "https://r.jina.ai/{单集URL}"
```

坑（实测）：
- 搜索是按词匹配的，全名可能搜不到：`The Pitt` 无结果，搜 `Pitt` 才命中。失败时去掉 The/标点，用剧名里最独特的一个词重搜
- 从 markdown 链接里抽出的 URL 可能带尾部空格，拼给 r.jina.ai 前先修剪，否则返回空
- 同名剧按年份区分（如 Severance 1988 vs 2022–…），选年份对的那个

### 方法 C：通用 WebSearch

`"{剧名}" "S{xx}E{xx}" transcript script site:transcripts.foreverdreaming.org OR site:subslikescript.com OR site:springfieldspringfield.co.uk`

剧集的 Fandom Wiki transcript 页也是可靠来源。

### 方法 D：直连兜底（r.jina.ai 不可用时，仅限 Springfield）

如果 r.jina.ai 超时或限流，直接 curl Springfield 原始页面并本地清洗：

```bash
# 注意起点必须匹配 class="scrolling-script-container"（带 class=）——
# 裸的 scrolling-script-container 会先命中页面内联 CSS，抓到样式表
curl -sL "https://www.springfieldspringfield.co.uk/view_episode_scripts.php?tv-show=${SHOW_SLUG}&episode=s02e03" \
  | sed -n '/class="scrolling-script-container"/,/<\/div>/p' \
  | sed -E 's/<br>/\n/g; s/<[^>]+>//g' \
  | sed '/^[[:space:]]*$/d'
```

### 找不到时

告诉用户：「未找到《{剧名}》第{season}季第{episode}集的字幕，请从网上复制剧本文字后发给我，我继续处理。」

---

## 第二步：提取词汇 — 50 个

提取标准（按优先级）：
1. **Phrasal verbs**：get away with、pull off、cut it out 这类动词短语
2. **习语和固定搭配**：字面意思和实际意思不同的表达
3. **俚语/口语**：词典查不到准确语境的词
4. **B2-C1 级实用词汇**：跳过 hello、sorry 等基础词，但真实场景高频出现

每个词条格式：
```
序号. 词/短语 | 释义（用户母语） | IPA音标 | 原句 | 原句译文（用户母语）
```

直接从剧本中找原句，不要自己造句。相同英文原句只保留一条。

---

## 第三步：生成 Anki CSV

路径：`~/Downloads/anki-{剧名slug}-{SxxExx}.csv`

文件开头必须写 Anki 导入指令头（以 `#` 开头的行），让 Anki 自动完成分隔符、字段映射和牌组，用户无需手动确认映射：

```
#separator:Comma
#html:false
#notetype:Basic
#deck:追剧英语::{剧名}
#columns:Front,Back
"英文原句","译句（释义 /IPA/）"
"英文原句","译句（释义 /IPA/）"
```

- **Front = 英文原句**（看英文考自己），**Back = 母语译句 +（释义 /IPA/）**，不要反
- 数据行用英文双引号包裹每个字段，内部引号用两个双引号转义
- 指令头之后不再加表头行

---

## 第四步：保存词汇笔记

路径：`{notes_dir}/{剧名}/YYYY-MM-DD-{剧名}-{SxxExx}.md`（`notes_dir` 读 `config.md`）

目录不存在时自动 `mkdir -p`。

```markdown
---
title: "{剧名} {SxxExx} 词汇"
date: YYYY-MM-DD
tags: [english, series-vocab]
source: {Springfield Springfield / subslikescript / 其他来源}
---

# {剧名} {SxxExx} 词汇表

共 {N} 个词条。Anki 文件：`~/Downloads/{csv文件名}`

---

## 词汇列表

| # | 词/短语 | 释义 | IPA | 英文原句 | 译句 |
|---|---------|------|-----|---------|------|
| 1 | ... | ... | ... | ... | ... |

---

## 如何使用

1. 复习这些词（10-15 分钟）
2. 看这集时注意这些词出现的场景
3. 把 CSV 导入 Anki：File → Import → 选文件 → Import（牌组和字段映射已由文件头自动设置）
```

---

## 完成回复格式

```
✅ {剧名} {SxxExx} 词汇提取完成

📚 共提取 {N} 个词条
📄 Anki CSV：~/Downloads/{csv文件名}
📝 词汇笔记：{notes_dir}/{剧名}/{filename}.md

导入 Anki：File → Import → 选 CSV → Import 即可
（牌组「追剧英语::{剧名}」和正反面映射已在文件头设好，无需手动调整）

建议：先花 10 分钟过一遍词汇，再看这集。
```

---

## 版权边界

字幕/剧本内容来自公开网页，仅供用户个人学习使用；不要把整集剧本原文写入产出文件（笔记和 CSV 里只保留选出的例句）。

