Communitygithub.com

Michael-Steshenko/aoe-editor

完整的《帝国时代》视频编辑与发布工作流。自动检测并切割游戏录制会话为独立比赛片段,生成真实风格的 YouTube 缩略图,并管理 YouTube 定时上传。

aoe-editor 是什么?

该技能为 Claude Code 等 AI 代理提供了一个端到端的 Age of Empires 游戏视频处理工作流。它会扫描录制的游戏会话文件,自动检测每一局比赛,将游戏片段剪辑成独立的 mp4 文件,并按照日期子文件夹(如 27Oct26)进行存储。技能内置了严格的时长过滤规则:少于 7 分钟的短游戏会被自动跳过(但保留原始编号),而一边倒的比赛会被标记出来供用户审核。在命名方面,本地文件保留比赛编号和胜负信息,而上传到 YouTube 的标题则严格隐藏输赢结果和游戏编号,以保持悬念。缩略图生成是其核心亮点:它能自动从比赛视频中截取激战正酣的瞬间(而非战后的废墟),并生成带有大字体、粗描边、双色文字的动态风格缩略图,文字必须避开画面中关键单位。此外,该技能还包含 YouTube 上传调度(检查定时队列、分配播放列表)、源文件保护(重命名而非删除)以及 Windows 系统睡眠锁定机制,确保整个批量处理流程可以无人值守运行。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add Michael-Steshenko/aoe-editor-skill

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

AoE Editor

使用此技能来处理长时间的《帝国时代》(Age of Empires, AoE) 游戏录制会话,将其切割成干净、独立的比赛片段,生成真实的 YouTube 缩略图,并管理 YouTube 定时上传。

严格的安全与防护护栏

1. 源录制文件的保留与完成标记

[!IMPORTANT] 永远不要删除源录制文件 —— 使用 - aoe-editor-done 标记已完成的文件 在任何情况下,代理都不得删除、移除或覆盖原始的源录制文件(例如位于 $env:USERPROFILE\Videos\ 中的文件)。

  • 处理期间源文件保持不动:即使在成功提取、审核或上传到 YouTube 之后,原始会话录像也绝不能删除。
  • 完成后重命名( - aoe-editor-done):一旦源录制中的所有游戏都已编辑、切片、验证并保存到目标日期文件夹,必须通过对源文件进行重命名,在其扩展名之前追加 - aoe-editor-done:
    • 示例 (.mp4): 2026-10-27 20-35-29.mp4 -> 2026-10-27 20-35-29 - aoe-editor-done.mp4
    • 示例 (任意扩展名): <filename>.<ext> -> <filename> - aoe-editor-done.<ext>
    • PowerShell 命令:
      $item = Get-Item "<SourcePath>"
      Rename-Item -Path $item.FullName -NewName "$($item.BaseName) - aoe-editor-done$($item.Extension)"
      
  • 跳过已完成的文件:在扫描或识别要处理的录制会话时,始终忽略并跳过任何在其扩展名前已包含 - aoe-editor-done 的文件。
  • 被丢弃的游戏:对于被跳过或丢弃的游戏(例如,时长 < 7 分钟),只需跳过该片段的提取。切勿剪切、截断或删除源视频的任何内容。
  • 仅清理临时文件:只有临时暂存文件(例如临时/暂存文件夹中的样例帧 JPEG)可以被清理。永远不要删除源视频文件。

2. 严格的安全与凭证保护

[!CAUTION] 永远不要读取凭证或令牌文件 在任何情况下,代理都不得读取、查看、显示或检查任何凭证文件、密钥或令牌的内容。

  • 零检查:特别地,绝对不要读取、检查、cat、打印或输出 $env:USERPROFILE\Videos\yt-uploader\ 中的任何文件(例如 request.token、youtube.token.json、client_secrets.json 或任何 *.token / *.json 凭证文件)。
  • 仅执行:在执行 yutu 时,仅使用环境变量(YUTU_CREDENTIAL、YUTU_CACHE_TOKEN)和命令行标志来调用它。绝不要检查或输出它读取的令牌或密钥。

3. 无人值守处理期间的防睡眠机制(原生保持唤醒)

为使工作流能够完全无人值守运行(检测、剪辑片段、渲染缩略图或批量上传到 YouTube),同时允许用户的显示器按正常设置关闭或休眠,请使用以下方法:

  • 默认方法(原生 Windows API - 屏幕可以休眠):使用 Windows SetThreadExecutionState 和 ES_CONTINUOUS | ES_SYSTEM_REQUIRED (0x80000001)。这会告知 Windows 后台处理/上传正在活动,保证 CPU、磁盘和网络永不进入睡眠状态,同时允许监视器按照正常的 Windows 电源设置关闭或休眠:
    $sig = '[DllImport("kernel32.dll", SetLastError=true)] public static extern int SetThreadExecutionState(int esFlags);'
    $power = Add-Type -MemberDefinition $sig -Name 'PowerHelper' -Namespace 'SystemSleep' -PassThru
    # 阻止系统睡眠(允许显示器休眠)
    $power::SetThreadExecutionState([int]0x80000001)
    
  • 释放睡眠锁:一旦所有批量任务或上传完成,将执行状态重置回默认的连续模式:
    $power::SetThreadExecutionState([int]0x80000000)
    
  • 替代方案 (Caffeine):Caffeine 已安装在 caffeine64.exe。由于 Caffeine 每 59 秒模拟一次键盘输入,它会阻止显示器睡眠,除非物理关闭显示器。建议使用上述原生方法作为标准。
  • 推荐时长/用法:
    • 在一次批量作业(特别是上传,6-8 GB 的视频可能需要 1-3 小时)期间保持活动状态,并在完成后立即释放。

目标文件夹结构

所有处理过的游戏和缩略图都保存在从录制文件名派生的、带有日期的 aoe 子文件夹中:

$env:USERPROFILE\Videos\aoe\<DDMmmYY>\
  ├── Game 1 - <MyCiv> vs <OpponentCiv> (<Map> - <Result>).mp4
  ├── Game 1 - <MyCiv> vs <OpponentCiv> (<Map> - <Result>).png       # 缩略图,名称与视频完全匹配
  ├── Game 3 - <MyTeamCivs> vs <OpponentCivs> (<Map> - <Result>).mp4 # (例如,Game 2 因 <7m 被丢弃)
  ├── Game 3 - <MyTeamCivs> vs <OpponentCivs> (<Map> - <Result>).png
  └── ...

日期文件夹规则

  • 日期从视频文件名中解析:YYYY-MM-DD ...
    • 示例:2026-10-27 20-35-29.mp4 -> 27Oct26
    • 示例:2026-10-29 19-46-42.mp4 -> 29Oct26
    • 格式:<Day><3-letter Month><2-digit Year>(例如,13Oct26、27Oct26、29Oct26)。

游戏过滤与时长规则

  1. 7分钟以下的短游戏(自动丢弃/跳过导出):

    • 任何游戏内时长低于7分钟(例如,早期投降、断线、启动失败)必须跳过导出(不提取或保存为输出片段)。不要删除、截断或修改原始源视频的任何部分。
    • 保留按时间顺序编号:被丢弃的游戏仍然占用其在录制会话中的时间顺序编号。
      • 示例:如果游戏1为18分钟,游戏2为2分钟(被丢弃),游戏3为25分钟,则生成的输出文件将是 Game 1 - ... 后跟 Game 3 - ...。游戏2在文件列表中被跳过,这样编号就能准确反映原始比赛顺序。
  2. 一边倒/沉闷的游戏(切割并供用户审核):

    • 如果比赛看起来严重一边倒或沉闷(例如,早期分数大幅领先、抵抗/交战极少、毫无竞争性的碾压):
      • 照常切割并保存游戏到日期文件夹,以便本地录像得以保留。
      • 提示用户:将片段详情、时间戳以及为何感觉一边倒/沉闷告知用户。要求用户审查该片段,然后再决定是否将其加入 YouTube 上传队列。

游戏检测与修剪规则

  1. 片段起始点:

    • 在加载屏幕过渡到游戏开始(城镇中心和起始单位出现)时立即开始。
  2. 片段结束点与赛后分析:

    • 保留赛后分析:如果玩家查看了赛后成就画面(总结、军事、经济、科技、社会)或观看了回放分析,则将其保留在游戏视频片段中。
    • 片段在玩家离开赛后画面/回放返回主菜单或队列时结束。
  3. 需要剪掉的内容:

    • 匹配队列等待时间。
    • 大厅等待和文明选择倒计时画面。
    • 任何空闲时间、桌面浏览或离开键盘 (AFK) 的片段。

严格的命名约定

1. 本地视频和缩略图文件名 (.mp4 / .png)

本地磁盘上的文件用于本地跟踪、归档和比赛时间顺序记录:

  • 游戏编号:会话中的时间顺序比赛索引(Game 1、Game 2 等),为 <7m 被丢弃的比赛保留跳过的编号。
  • 文明:
    • 1v1:Game <N> - <MyCiv> vs <OpponentCiv> (<Map> - <Result/Notes>).mp4
      • 示例:Game 1 - Ethiopians vs Franks (Arabia - Win).mp4
    • 团队赛:Game <N> - <MyTeamCivs> vs <OpponentCivs> (<Map> - <Result/Notes>).mp4
      • 示例:Game 3 - Khmer and Franks vs Persians and Bohemians (Arena - Win).mp4
  • 缩略图文件名:必须与 .mp4 文件名逐字符匹配,将 .mp4 替换为 .png。

2. YouTube 视频标题(通过 -title / -metaJSON 上传到 YouTube)

[!IMPORTANT] YouTube 标题:无胜负剧透,无游戏编号 发布到 YouTube 的标题绝不能泄露比赛结果,并且绝不能包含会话游戏编号:

  • 不要包含 Win 或 Loss:绝不为观众剧透比赛结果。
  • 不要包含 Game 1、Game 2 等:YouTube 上的观看者浏览的是独立比赛,而不是原始的会话索引。
  • 标准 YouTube 标题语法: <MyTeamCivs> vs <OpponentCivs> AOE2 <MatchFormat> <Map>
    • 1v1 格式: <MyCiv> vs <OpponentCiv> AOE2 1v1 <Map>
      • 示例:Khmer vs Bohemians AOE2 1v1 Arena
      • 示例:Dravidians vs Tatars AOE2 1v1 Arabian Desert
      • 示例:Ethiopians vs Franks AOE2 1v1 Arabian Desert
    • 2v2 格式: <Civ1> & <Civ2> vs <Civ3> & <Civ4> AOE2 2v2 <Map>
      • 示例:Khmer & Franks vs Persians & Bohemians AOE2 2v2 Arena
      • 示例:Khmer & Bengalis vs Malians & Mongols AOE2 2v2 Arena
    • 3v3 格式: <Civ1>, <Civ2> & <Civ3> vs <Civ4>, <Civ5> & <Civ6> AOE2 3v3 <Map>
      • 示例:Khmer, Bohemians & Goths vs Ethiopians, Romans & Celts AOE2 3v3 Arena
    • 4v4 格式: <Civ1>, <Civ2>, <Civ3> & <Civ4> vs <Civ5>, <Civ6>, <Civ7> & <Civ8> AOE2 4v4 <Map>
      • 示例:Ethiopians, Franks, Britons & Mayans vs Mongols, Tatars, Turks & Persians AOE2 4v4 Black Forest

真实缩略图与动态模因指南 (.png)

[!IMPORTANT] 缩略图文件名必须与视频文件名匹配 每个视频的缩略图文件名必须与视频文件名完全匹配(将扩展名替换为 .png):

  • 视频:Game 1 - Ethiopians vs Franks (Arabia - Win).mp4
  • 缩略图:Game 1 - Ethiopians vs Franks (Arabia - Win).png
  • 视频:Game 3 - Khmer and Franks vs Persians and Bohemians (Arena - Win).mp4
  • 缩略图:Game 3 - Khmer and Franks vs Persians and Bohemians (Arena - Win).png

避免误导性的点击诱饵或重复单一模因。缩略图应基于实际发生的情况,保持模因编辑多样化、有机且适合比赛故事:

1. 高影响力缩略图风格与排版

设计大胆、高对比度的排版,针对移动信息流可读性进行优化:

  • 大而有力的文字:字体大小必须足够大,在移动信息流中能立即看清(1440p 分辨率下 fontsize=140 到 160,其他分辨率按比例缩放)。切勿使用小字体或低对比度文字(<100)。
  • 粗轮廓和投影:使用厚重的黑色边框(borderw=8 到 12)和阴影(shadowx=4:shadowy=4:shadowcolor=black),使文字在任何背景下都能突出显示。
  • 双色调与多色文字风格:不要默认使用简单的纯白色文字。在单词/行之间使用对比鲜明、鲜艳的颜色:
    • 顶部单词用白色 (#FFFFFF),底部/点睛单词用鲜艳的金色/黄色 (#FFD700 或 #FFE500) 或橙色 (#FF8C00)。
    • 双色调布局示例:
      • "LETS STEAL"(白色) / "SOME GOLD!"(黄色)
      • "OUTPOST"(白色) / "REVENGE!"(橙色)
      • "CASTLE"(白色) / "MELTERS"(黄色)
      • "WHY MAKE"(白色) / "THESE?!"(橙色)
      • "SCORPION"(白色) / "DEATHBALL"(黄色)
      • "CELT SIEGE"(黄色) / "UNSTOPPABLE"(白色)
  • 动态灵活的文字位置(严格主体避让):
    • [!IMPORTANT] 文字绝不能覆盖焦点单位或主体

    • 文字叠加层绝不能覆盖、遮挡或位于钩子中命名的焦点单位、建筑或战术事件之上(例如,如果钩子说 "SIEGE ELEPHANT BREACH",攻城象必须保持 100% 可见且不被文字遮挡)。
    • 将文字严格放置在不覆盖动作区域的位置(在开放的负空间、战争迷雾或空旷地形中)。
    • 检查单位在哪里、战斗发生在屏幕何处,并动态将文字放置在顶部中央、顶部左侧、顶部右侧或底部中央,以便焦点动作和主体单位完全不被遮挡。

2. 动作帧选择与视觉文字证实

  • 零闲置基础帧:绝不要选择画面拉回到和平的家乡农场、城镇中心或经济队列,而动作发生在别处的帧。
  • 进行中的主动战斗与攻击(绝不是战后余波或空废墟):
    • 帧必须捕捉实时的、进行中的战斗或攻击:单位在肉搏中积极交锋、射箭、发射攻城弹丸、掠夺经济区或攻击敌方基地/城堡。
    • 没有空的静态废墟:绝不要选择破碎墙壁或受损建筑的帧,其中没有敌方单位在主动攻击或存在。没有活跃部队的破墙看起来被遗弃、静态且无趣。
    • 没有战后余波(地面尸体):绝不要选择战斗结束后、只显示地上尸骸、其余单位闲立的帧。捕捉战斗期间的动作,而不是之后。
  • 无结果泄露或分数剧透:
    • 缩略图绝不能泄露比赛结果:
      • 绝不要捕捉显示 "Player X resigned" 在聊天中或计分框中玩家名字被划掉的帧。
      • 没有分数差距 / 基地被碾压泄露:绝不要选择右下角计分框显示巨大分数差距(例如,玩家分数为对手的 70–75%)且玩家基地被摧毁/被掠夺的帧。这会明显向观众泄露失败信息,破坏悬念。保持分数和棋盘状态模糊或裁剪/干净。
    • 所有缩略图帧必须在活跃、紧张、竞技的游戏过程中捕捉。
  • 面部摄像头表情质量与裁剪检查协议:
    • 如果录制内容包含网络摄像头/面部摄像头叠加层:
      • 专用面部摄像头检查(以 1:1 比例裁剪并验证):绝不要仅依赖全 1440p 视图来判断面部表情。代理必须在最终确定帧之前,单独裁剪并检查面部摄像头区域(crop=390:300:0:890 或等效网络摄像头框)的像素级比例。

……

[用于翻译的截断内容]

相关技能