mcpField
W
wjs-uploading-video

wjs-uploading-video

github.com/jianshuoクリエイティブ・メディア137157 回インストール今日更新
リポジトリ

wjs-uploading-video について

wjs-uploading-videoは、完成したMP4をYouTubeにアップロードするスキルです。単一動画とメタデータ付きディレクトリの一括処理に対応し、チャンク送信による再開可能なアップロードや再試行、既存アップロードのスキップを行います。

主な機能

  1. 01単一動画またはディレクトリ一括アップロード
  2. 02UPLOAD_META.mdから動画情報を取得
  3. 03チャンク送信による再開可能なアップロード
  4. 04ネットワークやサーバーエラーの再試行
  5. 05結果を記録しアップロード済み動画をスキップ

活用シーン

  1. 01編集済み動画をYouTubeに公開
  2. 02タイトルと説明付きのシリーズ動画を一括アップロード
  3. 03動画の公開範囲、再生リスト、公開予約を設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jianshuo/claude-skills --skill wjs-uploading-video

インストール後、Claude Code で/wjs-uploading-videoを入力して読み込まれたか確認します。

同梱ファイルreferences/credentials-setup.mdscripts/upload_youtube.py

詳細

wjs-uploading-video

完成した動画を YouTube にアップロードします。デフォルト設定は、このユーザーのワークフロー(王建硕チャンネル、中国のネットワーク環境とローカルプロキシ、Riverside/マルチカム編集による 1080p 横向き録画)に合わせて調整されています。

使用する場面

  • ユーザーが完成済みの .mp4 ファイルを 1 つ以上持っていて、YouTube にアップロードしたい場合
  • ユーザーが複数のセグメントと UPLOAD_META.md を含む final/ ディレクトリを指定した場合
  • ユーザーが特定のプライバシー設定/再生リスト/公開日時を指定した場合

以下の場合は使用しないでください:

  • 微信视频号へのアップロード(公開 API がないため、ユーザーがウェブから手動でアップロードします)
  • 抖音/小红书/B 站(別の API を使用するため、ここでは未実装です)
  • 横向きのソース動画から YouTube Shorts 用の動画を作成する場合(まず wjs-reframing-video を使って 9:16 の動画を作成し、その後このスキルでアップロードしてください)

前提条件(マシンごとに初回のみ)

  1. Google Cloud OAuth クライアント:~/.config/youtube/credentials.json が存在する必要があります。ない場合は、5 分でできるセットアップについて references/credentials-setup.md を参照してください。
  2. Python の依存関係:pip3 install google-auth-oauthlib google-api-python-client requests(アップロード時に厳密に必要なのは google-auth と requests だけですが、OAuth ライブラリがそれらをインストールします)。
  3. 初回のアップロード時は Google の同意画面を開き、~/.config/youtube/token.json にトークンを書き込みます。以降の実行では、保存済みのトークンを使って自動的に処理します。

仕組み(標準の youtube-uploader を使わない理由)

YouTube の再開可能なアップロードプロトコルでは、メタデータの POST 後に Location: URL が発行され、その後、チャンク化した PUT リクエストでバイト列を受け付けます。標準の google-api-python-client はこれを httplib2 経由で実行しますが、このユーザーのローカル SOCKS+HTTP プロキシ環境では、後続の PUT で [Errno 65] No route to host または socket.timeout が発生し、処理が停止したままになります。

このスキルでは httplib2 を介さず、google-auth で OAuth を行った後、プロキシを明示的に指定して requests で再開可能なアップロードを手動で実行します。チャンクは 8 MB(標準の 256 KB ではありません)に設定しており、プロキシ経由の往復回数を減らせます。socket.timeout/ConnectionError/5xx エラーの場合は、指数バックオフで再試行します。

「YouTube API クライアントをそのまま呼び出せばよい」と考えても、この環境では失敗するため、使用しないでください。

ModuleNotFoundError: No module named 'google.oauth2' — Homebrew による Python のメジャーバージョンアップ後、site-packages が消えることがあります(2026-08 に 3.13→3.14 で実際に発生)。pip で再インストールせず、依存関係を指定して uvx で実行してください(動作確認済み):

uvx --with google-auth --with requests python \
  ~/.claude/skills/wjs-uploading-video/scripts/upload_youtube.py --dir "/path/to/final"

使用方法

final/ ディレクトリを一括アップロードする
python3 ~/.claude/skills/wjs-uploading-video/scripts/upload_youtube.py \
  --dir "/path/to/final" \
  --meta "/path/to/final/UPLOAD_META.md"

このスクリプトは次の処理を行います。

  1. UPLOAD_META.md を読み込み、各 ## NN · filename.mp4 ブロックを --dir 内の動画ファイルに対応付けます
  2. --results-file(デフォルトは <dir>/.youtube_upload_results.json)に記録済みの動画はスキップします。失敗後に再実行しても安全です
  3. 8 MB ごとに進捗を表示しながら、順番にアップロードします
  4. 最終的な URL の一覧を --results-file に書き込みます
単一ファイル
python3 ~/.claude/skills/wjs-uploading-video/scripts/upload_youtube.py \
  --video /path/to/clip.mp4 \
  --title "My Title" \
  --description "Body text" \
  --tags "tag1,tag2,tag3"
よく使うオプション
オプションデフォルト説明
--privacypublicprivate/unlisted/public
--category2828 = 科学・技術。27 = 教育。24 = エンターテインメント。
--made-for-kidsfalseYouTube ではこの申告が必要です
--playlist <ID>なしアップロードした各動画を再生リストに追加します
--publish-at <ISO8601>なし公開を予約します(--privacy private が必要です)
--credentials~/.config/youtube/credentials.jsonOAuth クライアントの JSON ファイル
--token~/.config/youtube/token.jsonキャッシュ済みの OAuth トークン
--chunk-mb8アップロードが途中で失敗し続ける場合に、より小さいチャンクを指定します
--dry-runオフメタデータを解析してアップロード対象を一覧表示します。ネットワークには接続しません

UPLOAD_META.md の形式

パーサーは、次の標準的な構造を想定しています。

## 01 · segment_01_no-bugs.mp4

**短标题**
代码没有错误,只有意图不一致

**视频描述**
AI 时代屎山的重新定义...

—— 王建硕 × 任鑫《...》第 1 集

#王建硕 #AI编程 #ClaudeCode

---

対応関係:

  • ## NN · <filename> → このブロックが説明する動画
  • **短标题**(または **Title**)ブロック → YouTube のタイトル(原文のまま)。短いタイトルでも問題ありませんが、YouTube の文字数上限は 100 文字です。シリーズ名を含む、より情報量の多いタイトルにしたい場合は、**短标题** にそのように記述してください
  • **视频描述**(または **Description**)ブロック → YouTube の説明(原文のまま)。末尾の #tag ハッシュタグも残してください
  • 视频描述 内のすべての #word トークン → カンマ区切りの YouTube のタグ(各 # は削除されます。全体的な指示に従い、ユーザーのチャンネル名 王建硕 が自動的に先頭に追加されます)

見出しのファイル名は、--dir 内の実ファイルと一致している必要があります。ファイルは存在するのにメタブロックがない場合、スクリプトはエラーを明示して終了します。そのファイルを空の説明と --title <basename> でアップロードするには、--allow-missing-meta を渡してください。

このスキルに組み込まれた適切なデフォルト設定

  • プライバシー = public:動画はすぐに公開され、登録者のフィードや検索結果に表示されます。先に確認したい場合は、呼び出しごとに --privacy unlisted(リンクを知っている人のみ)または --privacy private(所有者のみ)で上書きできます
  • カテゴリ = 28(科学とテクノロジー):王建硕チャンネルの主なコンテンツに合っています。アップロードごとに --category で上書きできます
  • selfDeclaredMadeForKids = false:YouTube で必須の設定です。ユーザーのコンテンツは成人向けです
  • チャンクサイズ = 8 MB:このユーザーのローカルプロキシで動作確認済みのサイズです(256 KB では停止しました)
  • アップロード済みの動画はスキップ:結果ファイルが正とする情報源です。削除すると再アップロードされます

チャンネル名の CTA ルール

動画のメタデータに説明文のフッター、署名、「チャンネル登録してください」といった文言を記述する場合は、ユーザーのチャンネル名である 王建硕 を使用してください。ゲストの名前は記載しないでください。任鑫のようなゲストは会話相手として説明文の本文に記載し、チャンネル CTA の欄には決して記載しないでください。

トラブルシューティング

症状対処方法
同意画面で access_denied 403 が発生するGoogle Cloud Console で OAuth クライアントのテストユーザーリストに、ユーザーの Google アカウントを追加します
アップロード中に [Errno 65] No route to host が発生するほとんどの場合、プロキシの問題です。curl --max-time 10 https://upload.googleapis.com/upload/youtube/v3/videos が 4xx を返すことを確認してください(どの 4xx でもプロキシには到達できています)。000 の場合はプロキシが停止しています
進行状況の行が表示されず、アップロードが停止するプロキシが通知せずにデータをバッファリングしています。--chunk-mb 4 に下げるか、プロキシデーモンを再起動してください
quotaExceeded(API ユニット)が発生するYouTube Data API のデフォルト割り当て量は 1 日あたり 10,000 ユニットで、アップロード 1 回につき 1,600 ユニットを消費します。そのため、1 日あたり約 6 回アップロードできます。Google Cloud Console で割り当て量の増加をリクエストするか、アップロードを複数日に分けてください
429 rateLimitExceeded · Video Uploads per day が発生するAPI ユニットとは別の制限です。YouTube のプロジェクトごとの1 日あたりの動画アップロード数の上限で、不正利用対策としてプロジェクトの確認ステータスに関連付けられており、非常に低い場合があります。この上限に達すると、バッチ内のすべてのアップロードが init session failed: 429 で失敗し、1 件も成功しません。これはプロキシや認証の問題ではなく、回避できません。上限は米国太平洋時間の午前 0 時(お使いの地域の午前 0 時ではありません)にリセットされます。対処方法:PT のリセットを待って再実行します(結果ファイルはクリアされているため、すべて再試行されます)。またはYouTube Studio のウェブ UI からアップロードします(この API の上限は消費しません)。あるいは GCP プロジェクトの確認を受けて上限を引き上げます。同じ PT 日に行ったそれ以前のアップロード(手動の API アップロードも含む)も、この件数に加算されます
トークンの更新に失敗する~/.config/youtube/token.json を削除して再実行してください。OAuth のブラウザーフローが再開されます

アップロード後

  • 結果は --results-file に保存されます(JSON:ファイル、タイトル、動画 ID、URL)
  • URL の一覧を Markdown の表にしてユーザーに返してください
  • デフォルトでは動画は public です。アップロードが完了した時点ですぐに公開されます。ユーザーが確認のための猶予を希望していた場合は、--privacy unlisted を指定して再アップロードするか、YouTube Studio で限定公開に切り替えられることを伝えてください
  • 合集/シリーズについて言及があった場合は、YouTube の再生リストを作成し、新しいアップロードをまとめて追加することを提案してください(ユーザーから再生リスト ID を受け取るか、再生リストを作成してよいか確認する必要があります)

コメント