# Video To Article

> 当用户粘贴YouTube/B站等视频链接并要求将视频整理为文章、整理成文章、把视频内容写成文章、或类似请求时，立即使用此技能。自动下载字幕、翻译（如需要）、并生成精美的HTML文章。支持简体中文和英文两种输出语言。轻量高效，只保留必要的文件。

- **Type:** Skill
- **Install:** `agentstack add skill-librarier-f-video-to-article-skill-video-to-article-skill`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [Librarier-f](https://agentstack.voostack.com/s/librarier-f)
- **Installs:** 0
- **Category:** [Content & Media](https://agentstack.voostack.com/c/content-and-media)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [Librarier-f](https://github.com/Librarier-f)
- **Source:** https://github.com/Librarier-f/video-to-article-skill

## Install

```sh
agentstack add skill-librarier-f-video-to-article-skill-video-to-article-skill
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

## 核心改进（2024.05.09 更新）

### 1. Cookie 处理优化
- ✅ 自动生成标准 Netscape 格式的 cookies.txt
- ✅ 直接使用用户提供的 SESSDATA 值
- ✅ 保留 cookies.txt 用于后续使用
- ✅ 修复了路径和格式错误问题

### 2. 内容完整性增强
- ✅ 完整读取和处理 80% 以上的字幕内容
- ✅ 直接在内存中处理，不保存中间文件
- ✅ 不进行预截断，完整处理所有内容
- ✅ 增加内容完整性验证逻辑

### 3. 文件管理简化
- ✅ **只保留 cookies.txt**，其他临时文件直接删除
- ✅ 最终只生成一个 HTML 文章文件
- ✅ 不生成元数据、分析报告等中间文件
- ✅ 简化流程，提高处理速度

### 4. 工作流程优化
- ✅ 简化步骤，直接在内存中处理字幕
- ✅ 使用内置 HTML 模板，无需外部脚本
- ✅ 改善错误处理和调试信息
- ✅ 添加内容完整性检查清单

### 5. 高效生成策略
- ✅ 直接读取字幕到内存，不保存中间文件
- ✅ 基于模板直接生成 HTML，不使用 Python
- ✅ 快速预览和调整
- ✅ 清理临时文件，保持工作目录整洁

# 视频转文章技能

将视频的字幕内容转换为一篇结构清晰、排版精美的中文HTML文章。快速高效，只保留必要的输出文件。

## 快速安装

### 前置依赖

本 skill 依赖 **yt-dlp** 来下载视频字幕。**已内置于 skill 目录**，开箱即用：

```
video-to-article/
└── component/
    └── yt-dlp.exe    # Windows 版，已包含
```

> 如果内置版本无法使用，skill 会自动回退到系统 PATH 中的 yt-dlp。

#### macOS / Linux
如需手动安装：
```bash
# 方法一：使用 Homebrew（推荐）
brew install yt-dlp

# 方法二：使用 pip
pip3 install yt-dlp
```

#### Linux
如需手动安装：
```bash
# 方法一：使用 pip（推荐）
pip install yt-dlp

# 方法二：使用 pipx
pipx install yt-dlp

# 方法三：下载独立可执行文件
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp
```

### 安装 Skill

将本 skill 文件夹复制到 Claude Code 的 skills 目录：

```bash
# 克隆仓库
git clone https://github.com/YOUR_USERNAME/video-to-article.git

# 复制到 Claude Code skills 目录
# Windows
cp -r video-to-article "$HOME/.claude/skills/"

# macOS / Linux
cp -r video-to-article ~/.claude/skills/
```

### 验证安装

```bash
# 检查 yt-dlp 是否安装成功
yt-dlp --version

# 检查 skill 是否加载成功
# 在 Claude Code 中输入 /video-to-article 应该能看到 skill 说明
```

## 配置说明

### yt-dlp 路径配置

skill 会按以下顺序检测 yt-dlp：

| 优先级 | 平台 | 路径 |
|--------|------|------|
| 1（内置） | Windows | `{skill目录}/component/yt-dlp.exe` |
| 2 | Windows | `C:/Program Files/yt-dlp/yt-dlp.exe` |
| 3 | macOS | `/usr/local/bin/yt-dlp` |
| 4 | macOS | `/opt/homebrew/bin/yt-dlp` |
| 5 | Linux | `/usr/local/bin/yt-dlp` |
| 6 | Linux | `/usr/bin/yt-dlp` |

### 输出目录配置

默认输出目录：当前工作目录

可在 skill 调用时指定其他目录。

## 文章风格选项（HTML文章）

如果用户选择 **HTML文章**，**必须使用 AskUserQuestion 询问用户希望使用哪种风格**。

### 可选风格列表

| 序号 | 风格名称 | Style Name | 描述 | 设计特点 |
|------|---------|-----------|------|---------|
| 1 | **蓝白商务** | Blue & White Business | 默认风格，专业简洁 | 蓝色渐变Hero、白色卡片、衬线标题、柔和阴影 |
| 2 | **Notion深色** | Notion Dark Mode | Notion深色模式 | 深色背景、衬线标题、紧凑排版、彩色标注系统 |
| 3 | **Claude风格** | Claude Style | Claude经典设计系统 | 赭石红+米白背景、衬线字体、噪点纹理 |
| 4 | **暗黑科技** | Cyber Tech | 赛博朋克/黑客帝国风格 | 深黑背景、霓虹光效、故障艺术、网格动画 |
| 5 | **极简现代** | Minimal Modern | 简约留白、优雅衬线 | 极致留白、衬线字体、深绿强调 |

### 风格选择流程

> **注意**：`AskUserQuestion` 工具最多支持4个选项。

1. 当用户提供视频链接并要求生成HTML文章时
2. **第一步**：使用 AskUserQuestion 询问风格（4个选项，**极简现代包含在内**）：
   ```
   询问内容：请问您希望使用哪种文章风格？
   选项：
     1. 蓝白商务（推荐）- 专业简洁，蓝色渐变Hero
     2. Notion深色 - 深色背景，彩色标注系统
     3. Claude风格 - 赭石红+米白，噪点纹理
     4. 极简现代 - 简约留白，深绿强调，中文数字
   ```
3. **第二步（确认前）**：用户选完风格后，生成文章之前，主动提示还有另一种风格可选：
   ```
   询问内容：您选择了「XXX」风格。顺带一提，还有「暗黑科技」风格可选——赛博朋克风格，霓虹光效，要不要换？
   选项：
     1. 不用了，就用「XXX」
     2. 换成暗黑科技
   ```
4. 用户确认后，按对应风格的设计规范生成文章
5. 如果用户未指定风格，默认使用**蓝白商务 (Blue & White Business)** 风格

### 风格规范文件

- **蓝白商务**：`SKILL.md` 内置规范 + `references/blue-white-business-style.md`
- **Notion深色**：`SKILL.md` 内置「Notion深色风格设计规范」章节
- **Claude风格**：`references/claude-style.md`
- **暗黑科技**：`references/cyber-tech-style.md`
- **极简现代**：`references/minimal-modern-style.md`

## ⚠️ 内容来源与版权说明（重要）

**在使用本技能生成的内容时，必须遵守以下来源标注要求：**

### 为什么需要来源标注？

本技能基于视频字幕整理内容，生成的文章、口播稿等属于**二次加工**而非原创内容。为了：
- 尊重原视频创作者的版权
- 避免平台判定为抄袭/搬运
- 构建健康的内容生态

### 各平台来源标注要求

#### 小红书文案
在正文开头或结尾添加：
```
📺 内容来源：视频标题
🔗 原视频链接：https://www.youtube.com/watch?v=xxx
📢 整理自 @频道名称
```

#### 公众号文章
在文章开头（标题下方）添加：
```markdown
---
来源说明：
本文整理自 YouTube 视频《视频标题》
原视频链接：https://www.youtube.com/watch?v=xxx
原频道：@频道名称
---
```

#### 口播稿/短视频配音
在口播稿开头添加来源说明，并在视频描述中注明：
```
【内容来源】
本视频内容整理自：《视频标题》
原视频：https://www.youtube.com/watch?v=xxx
原频道：@频道名称
```

### 平台原创标识注意事项

| 平台 | 要求 | 建议 |
|------|------|------|
| **小红书** | 建议标注来源 | 发布时在正文或评论区注明 |
| **公众号** | 建议标注来源 | 文章开头添加来源说明 |
| **口播稿/短视频** | 必须标注 | 视频描述区+口播稿开头都要有 |
| **微信公众号** | 尊重原创 | 如需商用，建议联系原作者获得授权 |

### 用户引导话术

在生成内容后，**必须**向用户提示：

> 「⚠️ 重要提示：生成的内容基于视频字幕整理，发布前请务必添加原始视频来源信息。建议注明「内容整理自@频道名」或附上原视频链接，尊重原创，合理使用。」

---

## 输出平台选择

在用户输入视频链接后，**必须首先询问用户希望将内容输出到哪个平台**。

### 可选平台

| 平台 | 主格式 | 说明 |
|------|--------|------|
| **HTML文章** | `.html` | 网页阅读，保留原有功能 |
| **小红书文案** | `.txt` | 纯文本，复制即用 |
| **公众号文章** | `.md` | Markdown格式，支持排版工具 |
| **口播稿** | `.txt` | 短视频配音稿，可直接使用 |

### 完整交互流程

```
用户输入视频链接
        ↓
【步骤1】询问输出平台：
  1. HTML文章
  2. 小红书文案
  3. 公众号文章
  4. 口播稿
        ↓
【步骤2】根据平台询问具体选项：
  ├─ 选择HTML文章时 → 询问文章风格
  │   └─ 风格选择：蓝白商务/Notion深色/Claude风格/极简现代 → (是否换暗黑科技)
  ├─ 选择小红书文案时 → 询问文体类型
  │   └─ 文体：种草文/干货文/情感文/清单文
  ├─ 选择公众号文章时 → 询问文体类型
  │   └─ 文体：热点解读/深度长文/金句提炼/故事叙述
  └─ 选择口播稿时 → 询问文体类型
      └─ 文体：爆款开场/故事叙述/清单列表/情绪共鸣 → (是否选对话挑战)
        ↓
【步骤3】询问输出语言：
  1. 简体中文
  2. English
        ↓
生成对应格式的内容
```

### 小红书文体选项

| 文体类型 | 适用场景 | 模板文件 |
|---------|---------|---------|
| **种草安利文** | 产品推荐、好物分享 | `references/xiaohongshu/zhongcao.md` |
| **干货教程文** | 技能分享、方法教程 | `references/xiaohongshu/ganhuo.md` |
| **情感共鸣文** | 情感故事、人生感悟 | `references/xiaohongshu/qinggan.md` |
| **清单盘点文** | 资源整理、清单合集 | `references/xiaohongshu/qingdan.md` |

### 公众号文体选项

| 文体类型 | 适用场景 | 模板文件 |
|---------|---------|---------|
| **热点解读文** | 社会热点、行业趋势 | `references/wechat/redian.md` |
| **深度长文** | 知识科普、深度分析 | `references/wechat/shendu.md` |
| **金句提炼文** | 内容精华、语录整理 | `references/wechat/jinju.md` |
| **故事叙述文** | 案例分享、经历讲述 | `references/wechat/gushi.md` |

### 口播稿文体选项

| 文体类型 | 适用场景 | 模板文件 |
|---------|---------|---------|
| **爆款开场型** | 知识干货、认知颠覆 | `references/koupogao/baokuan.md` |
| **故事叙述型** | 个人经历、经验分享 | `references/koupogao/gushi.md` |
| **清单列表型** | 技巧盘点、方法汇总 | `references/koupogao/qingdan.md` |
| **对话挑战型** | 观点表达、争议话题 | `references/koupogao/duihua.md` |
| **情绪共鸣型** | 情感话题、人生感悟 | `references/koupogao/qingxu.md` |

### 双格式输出规范

| 平台 | 主格式 | 辅助格式 | 用途 |
|------|--------|---------|------|
| **小红书** | `.txt` | `.html` 预览 | 直接复制发布 / 本地预览 |
| **公众号** | `.md` | `.html` 预览 | 粘贴到编辑器 / 本地预览 |
| **口播稿** | `.txt` | `.html` 预览 | 直接配音使用 / 本地预览 |
| **HTML文章** | `.html` | - | 网页阅读 |

### 文件命名规范

```
{平台}-{文体类型}-{视频标题简称}.{扩展名}

示例：
├── HTML-蓝白商务-6个吸引力法则.html
├── 小红书-种草文-6个吸引力法则.txt
├── 小红书-种草文-6个吸引力法则-预览.html
├── 公众号-热点解读-6个吸引力法则.md
├── 公众号-热点解读-6个吸引力法则-预览.html
├── 口播稿-爆款开场-起床后工作1分钟.txt
└── 口播稿-爆款开场-起床后工作1分钟-预览.html
```

## Notion 深色风格设计规范

> 版本 1.0 · 基于Notion 2024深色模式实际观测值

### 色彩系统（Color System）

#### 基础背景层

| 层级 | 用途 | HEX | CSS 变量 |
|------|------|-----|----------|
| 底层背景 | 页面最外层 | `#191919` | `--bg-base` |
| 内容背景 | 文章主体卡片 | `#202020` | `--bg-surface` |
| 悬浮/弹出 | Tooltip、菜单 | `#2f2f2f` | `--bg-elevated` |
| 边框 | 分割线、表格线 | `#2e2e2e` | `--border` |
| 悬停高亮 | hover 状态 | `#ffffff0f` | `--hover` |

#### 文字色阶

| 层级 | 用途 | HEX | CSS 变量 |
|------|------|-----|----------|
| 主文字 | 正文、标题 | `#e3e3e3` | `--text-primary` |
| 次级文字 | 描述、副标题 | `#9b9b9b` | `--text-secondary` |
| 占位/禁用 | placeholder | `#555555` | `--text-muted` |

#### 强调色（彩色标注系统）

| 颜色 | 文字色 | 背景色 |
|------|--------|--------|
| 蓝 | `#4a7ab5` | `#0e1f3b` |
| 绿 | `#518c5a` | `#122215` |
| 橙 | `#c07a3d` | `#2e1e0f` |
| 黄 | `#b8a030` | `#292306` |
| 粉 | `#b05c83` | `#2e1020` |

### 字体系统（Typography）

#### 字体族

```css
/* 标题：衬线体 */
--font-serif: 'Noto Serif SC', Georgia, 'Times New Roman', serif;

/* 正文：无衬线体 */
--font-sans: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;

/* 代码 */
--font-mono: "SFMono-Regular", Menlo, Consolas, "Liberation Mono", Courier, monospace;
```

#### 字号与行高规范

| 元素 | 字号 | 行高 | 字重 |
|------|------|------|------|
| H1 | `2em` (约40px) | `1.2` | `700` |
| H2 | `1.5em` (约30px) | `1.3` | `600` |
| H3 | `1.25em` (约25px) | `1.3` | `600` |
| 正文（Body） | `16px` | `1.75` | `400` |
| 小字注释 | `14px` | `1.6` | `400` |

### 间距系统（Spacing）

```css
:root {
  --space-xs:  2px;
  --space-sm:  4px;
  --space-md:  8px;
  --space-lg: 16px;
  --space-xl: 24px;
  --space-2xl: 40px;
}
```

### 圆角系统

```css
:root {
  --radius-sm: 3px;   /* 内联元素 */
  --radius-md: 4px;   /* 按钮、输入框 */
  --radius-lg: 8px;   /* 卡片、容器 */
}
```

### 内容宽度

```css
.page-content {
  max-width: 708px;       /* Notion标准宽度 */
  margin: 0 auto;
  padding: 0 96px;        /* 两侧留白 */
}

@media (max-width: 768px) {
  .page-content { padding: 0 24px; }
}
```

### 设计原则

| 原则 | 说明 |
|------|------|
| **极简留白** | 内容即主角，装饰趋近于零 |
| **紧凑节奏** | 段落间距极小（1–4px），块与块之间呼吸感来自内容结构而非空白 |
| **中性色调** | 全站灰色系，彩色只服务于内容语义标注 |
| **无品牌强调** | 无蓝色链接、无彩色按钮，界面退场让文字前进 |
| **字重即层级** | 用字重（400/600/700）而非字色来区分标题层级 |
| **交互极克制** | hover仅加轻微背景，无阴影、无缩放、无弹跳 |

### Notion深色风格 HTML 模板

```html

  
  
  文章标题
  
  
    :root {
      /* 背景 */
      --bg-base:      #191919;
      --bg-surface:   #202020;
      --bg-elevated:  #2f2f2f;
      --border:       #2e2e2e;
      --hover:        rgba(255, 255, 255, 0.055);

      /* 文字 */
      --text-primary:   #e3e3e3;
      --text-secondary: #9b9b9b;
      --text-muted:     #555555;

      /* 强调色 - Notion 标注系统 */
      --accent-blue-text:    #4a7ab5;
      --accent-blue-bg:      #0e1f3b;
      --accent-green-text:   #518c5a;
      --accent-green-bg:     #122215;
      --accent-orange-text:  #c07a3d;
      --accent-orange-bg:    #2e1e0f;
      --accent-yellow-text:  #b8a030;
      --accent-yellow-bg:    #292306;

      /* 字体 */
      --font-serif: 'Noto Serif SC', Georgia, serif;
      --font-sans: ui-sans-serif, -apple-system, system-ui, sans-serif;

      /* 间距 */
      --space-xs:  2px;
      --space-sm:  4px;
      --space-md:  8px;
      --space-lg: 16px;
      --space-xl: 24px;
      --space-2xl: 40px;

      /* 圆角 */
      --radius-sm: 3px;
      --radius-md: 4px;
      --radius-lg: 8px;
    }

    * { margin: 0; padding: 0; box-sizing: border-box; }

    body {
      font-family: var(--font-sans);
      background: var(--bg-base);
      color: var(--text-primary);
      line-height: 1.75;
      font-size: 16px;
    }

    .page {
      max-width: 708px;
      margin: 0 auto;
      padding: 0 96px;
    }

    @media (max-width: 768px) {
      .page { padding: 0 24px; }
    }

    h1 {
      font-family: var(--font-serif);
      font-size: 2em;
      font-weight: 700;
      line-height: 1.2;
      color: var(--text-primary);
      margin-top: 80px;
      margin-bottom: var(--space-sm);
    }

    h2 {
      font-family: var(--font-serif);
      font-size: 1.5em;
      font-weight: 600;
      line-height: 1.3;
      color: var(--text-primary);
      margin-top: 1.6em;
      margin-bottom: var(--space-sm);
    }

    p {
      font-size: 16px;
      line-height: 1.75;
      color: var(--text-primary);
      margin: 1px 0;
    }

    a {
      color: inherit;
      text-decoration: underline;
      text-decoration-color: var(--text-secondary);
      text-underline-offset: 2px;
    }

    a:hover {
      text-decoration-color: var(--text-primary);
    }

    blockquote {
      border-left: 3px solid var(--text-primary);
      margin: var(--space-md) 0;
      padding: var(--space-sm) var(--space-lg);
      font-style: normal;
    }

    /* 标注块 (Callout) */
    .callout {
      display: flex;
      align-items: flex-start;
      gap: var(--space-md);
      border-radius: var(--radius-md);
      padding: var(--space-lg);
      margin: var(--space-md) 0;
    }

    .callout-blue {
      background: var(--accent-blue-bg);
    }
    .callout-green {
      background: var(--accent-green-bg);
    }
    .callout-orange {
      background: var(--accent-orange-bg);
    }
    .callout-yellow {
      background: var(--accent-yellow-bg);
    }

    .callout-icon {
      font-size: 18px;
      line-height: 1;
      flex-shrink: 0;
    }

    .callout-content {
      flex: 1;
    }
  

  
    分类标签
    文章标题
    正文内容...

    
      引用内容
    

    

    章节标题
    章节内容...

    
      💡
      
        重点提示内容
      
    
  

      flex-shrink: 0;
    }

    hr {
      border: none;
      border-top: 1px solid var(--border);
      margin: var(--space-lg) 0;
    }

    /* 标签 */
    .tag {
      display: inline-block;
      background: var(--accent-blue-bg);
      color: var(--accent-blue-text);
      padding: 2px 8px;
      border-radius: var(--radius-sm);
      font-size: 12px;
      font-weight: 500;
      margin-bottom: var(--space-md);
    }
  

  
    分类标签
    文章标题
    正文内容...

    
      引用内容
    

    

    章节标题
    章节内容...

    
      💡
      
        重点提示内容
      
    
  

```

## 工作流程（更新版）

### 交互式选择要求

**在生成文章之前，必须使用 AskUserQuestion 工具依次让用户选择以下选项：**

1. **输出平台**：HTML文章 / 小红书文案 / 公众号文章
2. **具体文体**：根据平台显示对应选项
3. **输出语言**：简体中文 / English

---

### 第零步：确认输出平台

**使用 AskUserQuestion 询问用户：**

```
询问内容：请问您希望将内容输出到哪个平台？
选项：
  1. HTML文章 - 网页阅读，保留原有功能
  2. 小红书文案 - 纯文本，复制即用
  3. 公众号文章 - Markdown格式，支持排版工具
  4. 口播稿 - 短视频配音稿，可直接使用
```

### 第零点五步：确认具体文体

根据平台选择，使用 AskUserQuestion 询问对应的具体文体：

**HTML文章：**
```
询问内容：请问您希望使用哪种文章风格？
选项：
  1. 蓝白商务（推荐）- 专业简洁，蓝色渐变Hero
  2. Notion深色 - 深色背景，彩色标注系统
  3. Claude风格 - 赭石红+米白，噪点纹理
  4. 暗黑科技 - 赛博朋克风格，霓虹光效
  5. 极简现代 - 简约留白，深绿强调
```

**小红书文案：**
```
询问内容：请问您希望使用哪种小红书文体？
选项：
  1. 种草安利文 - 产品推荐、好物分享
  2. 干货教程文 - 技能分享、方法教程
  3. 情感共鸣文 - 情感故事、人生感悟
  4. 清单盘点文 - 资源整理、清单合集
```

**公众号文章：**
```
询问内容：请问您希望使用哪种公众号文体？
选项：
  1. 热点解读文 - 社会热点、行业趋势
  2. 深度长文 - 知识科普、深度分析
  3. 金句提炼文 - 内容精华、语录整理
  4. 故事叙述文 - 案例分享、经历讲述
```

**口播稿：**
> **注意**：`AskUserQuestion` 工具最多支持4个选项，口播稿共5种文体，分两步进行。

第一步（4个选项）：
```
询问内容：请问您希望使用哪种口播稿文体？
选项：
  1. 爆款开场型 - 知识干货、认知颠覆
  2. 故事叙述型 - 个人经历、经验分享
  3. 清单列表型 - 技巧盘点、方法汇总
  4. 情绪共鸣型 - 情感话题、人生感悟
```

第二步（如果用户需要第5种可选风格）：
```
询问内容：还有一种「对话挑战型」风格——适合观点表达、争议话题，要不要看看？
选项：
  1. 不用了，就用前面的风格
  2. 对话挑战型 - 观点表达、争议话题
```

### 第一步：确认输出语言

使用 AskUserQuestion 询问输出语言：

```
询问内容：请问您希望文章使用哪种语言输出？
选项：
  1. 简体中文（推荐）- 翻译字幕后整理，适合中文读者
  2. English - 保留英文内容，适合国际读者
```

#### 语言相关处理

- **简体中文**：如果字幕是英文，需要翻译成中文后整理
- **English**：如果字幕是中文，需要翻译成英文后整理；如果字幕是英文，直接整理

### 第二步：获取视频信息（简化版）

直接使用 yt-dlp 获取基本信息，不保存到文件：

```bash
# 获取视频信息（输出到终端）
yt-dlp --print "%(title)s" --print "%(uploader)s" --print "%(upload_date)s" --print "%(duration)s" --print "%(thumbnail)s" --print "%(webpage_url)s" --skip-download "视频链接"
```

**从链接识别平台：**

| 平台 | 链接特征 | 图标 |
|------|---------|------|
| YouTube | `youtube.com` / `youtu.be` | 📺 |
| Bilibili | `bilibili.com` / `b23.tv` | 📱 |
| Twitter/X | `twitter.com` / `x.com` | 🐦 |
| Vimeo | `vimeo.com` | 🎬 |

### 第三步：下载字幕（简化高效版）

使用 yt-dlp 下载字幕，只保留必要的 cookie 文件：

**Cookie 处理（保留 cookies.txt）：**

如果用户提供了 SESSDATA（对于 Bilibili），我们会自动创建标准格式的 cookies.txt 文件（**这个文件会保留**）：

```bash
# 如果用户提供了 SESSDATA，自动创建 cookie 文件
if [ -n "$USER_SESSDATA" ]; then
  # 自动生成标准格式的 cookie 文件（保留）
  cat > cookies.txt /dev/null; then
  SUBTITLE_FILE=$(ls -1t *.zh-Hans.srt | head -1)
elif ls *.ai-zh.srt 2>/dev/null; then
  SUBTITLE_FILE=$(ls -1t *.ai-zh.srt | head -1)
elif ls *.srt 2>/dev/null; then
  SUBTITLE_FILE=$(ls -1t *.srt | head -1)
elif ls *.vtt 2>/dev/null; then
  SUBTITLE_FILE=$(ls -1t *.vtt | head -1)
fi
```

**关键改进说明：**
- 自动生成标准 Netscape 格式的 cookie 文件
- 同时尝试下载手动和自动字幕，确保获取最完整的内容
- 保留所有下载的字幕文件用于后续分析
- 记录字幕文件列表和行数

#### 支持的视频平台

| 平台 | 字幕支持 | 备注 |
|------|---------|------|
| YouTube | ✅ 手动+自动 | 最佳支持 |
| Bilibili | ✅ CC字幕 + AI字幕 | 有CC字幕直接下载；无字幕需提供SESSDATA获取AI字幕 |
| Twitter/X | ✅ 内嵌字幕 | 部分 video 支持 |
| Vimeo | ✅ 手动字幕 | 依赖上传者添加 |
| 其他 | ⚠️ 有限支持 | 取决于平台 |

### 第四步：处理字幕并生成HTML（直接内存处理）

**直接在内存中读取和处理字幕：**

```bash
# 直接读取字幕内容到变量，不保存中间文件
FULL_SUBTITLE_CONTENT=$(cat "$SUBTITLE_FILE")
CONTENT_LENGTH=$(echo "$FULL_SUBTITLE_CONTENT" | wc -c)
LINE_COUNT=$(echo "$FULL_SUBTITLE_CONTENT" | wc -l)

echo "📊 字幕文件统计:"
echo "  - 文件大小: ${CONTENT_LENGTH} 字节"
echo "  - 总行数: ${LINE_COUNT} 行"

# 简单的字幕清洗 - 去除时间戳标签但保留所有文本内容
CLEAN_CONTENT=$(echo "$FULL_SUBTITLE_CONTENT" | \
  sed '/^[0-9]\+$/d' | \
  sed '/-->.*$/d' | \
  sed '/^$/d' | \
  sed 's/]*>//g')

# 内容预览（前100行和后50行）
echo "📝 字幕内容预览（前100行）:"
echo "═══════════════════════════════════════════════════"
echo "$CLEAN_CONTENT" | head -100
echo "═══════════════════════════════════════════════════"
echo "📝 字幕内容预览（后50行）:"
echo "═══════════════════════════════════════════════════"
echo "$CLEAN_CONTENT" | tail -5

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [Librarier-f](https://github.com/Librarier-f)
- **Source:** [Librarier-f/video-to-article-skill](https://github.com/Librarier-f/video-to-article-skill)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** yes
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-librarier-f-video-to-article-skill-video-to-article-skill
- Seller: https://agentstack.voostack.com/s/librarier-f
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
