Communitygithub.com

Michael-Steshenko/aoe-editor

Age of Empiresの長時間録画セッションから個々の試合クリップを自動検出・編集し、YouTube用のサムネイル生成とアップロード管理を行う完全なエンドツーエンドワークフロー。

aoe-editor とは?

このスキルは、Age of Empires (AoE) のゲームプレイ録画を自動処理するためのツールです。長時間のセッション録画から個々の試合を検出し、日付ごとのサブフォルダに整理してクリップを抽出します。具体的には、ゲーム内の時代遷移チャプターを特定し、ポストゲーム分析を保持しながら、キューや待機時間をトリミングします。7分未満の短い試合は自動的に破棄されますが、元の録画ファイルの番号付けは維持されます。一方的な試合はフラグ付けされ、後でレビューできるようになります。さらに、各動画ファイル名に合わせた本格的なカスタムYouTubeサムネイルを生成し、オプションでユニットのミーム編集も可能です。YouTubeのスケジュールキューを動的に検査し、1対1とチーム戦のプレイリストに動画を割り当てます。元のソースファイルは絶対に削除せず、処理完了後にはファイル名に「 - aoe-editor-done」を追加してマークします。安全性を最重視し、ソース録画の削除や認証情報ファイルの読み取りを禁止する厳格なガードレールが実装されています。Windows環境で動作し、PowerShellスクリプトとYouTubeアップロードツール(yutu)を活用して、完全に無人でのバッチ処理を実現します。

対応~Claude Code~Codex CLI~Cursor
npx skills add Michael-Steshenko/aoe-editor-skill

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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] 認証情報やトークンファイルを決して読み取らないこと エージェントは、認証情報ファイル、シークレット、トークンの内容を決して読んだり、表示したり、検査したりしてはいけません。

  • ゼロインスペクション: 特に、$env:USERPROFILE\Videos\yt-uploader\ 内のファイル(request.token、youtube.token.json、client_secrets.json、または任意の *.token / *.json 認証情報ファイル)を決して読み取ったり、インスペクトしたり、cat したり、出力したりしてはいけません。
  • 実行のみ: 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~8GBのビデオで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は7分未満で破棄)
  ├── 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
    • フォーマット: <日><3文字の月><2桁の年> (例: 13Oct26、27Oct26、29Oct26)。

ゲームフィルタリングと時間ルール

  1. 7分未満の短いゲーム(自動破棄/エクスポートスキップ):

    • ゲーム内時間が7分未満のゲーム(例:早期リザイン、切断、開始失敗)は、エクスポートからスキップ(出力クリップとして抽出または保存しない)する必要があります。元のソースビデオの一部を削除、切り詰め、または変更しないでください。
    • 時系列番号の保持: 破棄されたゲームは、録画セッションからの時系列番号を消費します。
      • 例: Game 1が18分、Game 2が2分(破棄)、Game 3が25分の場合、出力ファイルは Game 1 - ... の後に Game 3 - ... になります。Game 2はファイルリストでスキップされ、番号は元の試合順序を正確に反映します。
  2. 一方的/退屈なゲーム(カット&ユーザーレビュー):

    • ゲームが非常に一方的または退屈に見える場合(例:大規模な早期スコア差、最小限の抵抗/交戦、非競争的な圧勝):
      • ゲームをカットして保存: 日付フォルダに通常通り保存し、ローカル映像を保持します。
      • ユーザーに通知: クリップの詳細、タイムスタンプ、一方的/退屈と感じた理由をユーザーに通知します。YouTubeアップロードのキューに入れる前に、クリップをレビューするようユーザーに依頼します。

ゲーム検出とトリミングルール

  1. クリップ開始点:

    • ローディング画面からゲーム開始(町の中心と初期ユニットが表示される)に移行する瞬間から開始します。
  2. クリップ終了点と試合後分析:

    • 試合後分析を保持: プレイヤーが試合後の実績画面(サマリー、軍事、経済、技術、社会)を確認したり、リプレイ分析を見たりする場合は、これをゲームビデオクリップに残します。
    • クリップは、プレイヤーが試合後画面/リプレイからメインメニューまたはキューに戻った時点で終了します。
  3. カットする部分:

    • マッチメイキングの待ち時間。
    • ロビーの待機時間と文明選択のカウントダウン画面。
    • アイドル時間、デスクトップブラウジング、離席(AFK)セグメント。

厳格な命名規則

1. ローカルビデオとサムネイルファイル名 (.mp4 / .png)

ディスク上のローカルファイルは、ローカル追跡、アーカイブ、および試合の時系列のために命名されます:

  • ゲーム番号: セッションからの時系列の試合インデックス(Game 1、Game 2など)。破棄された7分未満の試合のスキップされた番号を保持します。
  • 文明:
    • 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 または同等のウェブカムボックス)を分離して1:1ピクセルスケールでクロップし、検査する必要があります。 ...

[翻訳のため一部省略]

関連スキル