wjs-uploading-video について
wjs-uploading-videoは、完成したMP4をYouTubeにアップロードするスキルです。単一動画とメタデータ付きディレクトリの一括処理に対応し、チャンク送信による再開可能なアップロードや再試行、既存アップロードのスキップを行います。
主な機能
- 01単一動画またはディレクトリ一括アップロード
- 02UPLOAD_META.mdから動画情報を取得
- 03チャンク送信による再開可能なアップロード
- 04ネットワークやサーバーエラーの再試行
- 05結果を記録しアップロード済み動画をスキップ
活用シーン
- 01編集済み動画をYouTubeに公開
- 02タイトルと説明付きのシリーズ動画を一括アップロード
- 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 の動画を作成し、その後このスキルでアップロードしてください)
前提条件(マシンごとに初回のみ)
- Google Cloud OAuth クライアント:
~/.config/youtube/credentials.jsonが存在する必要があります。ない場合は、5 分でできるセットアップについてreferences/credentials-setup.mdを参照してください。 - Python の依存関係:
pip3 install google-auth-oauthlib google-api-python-client requests(アップロード時に厳密に必要なのはgoogle-authとrequestsだけですが、OAuth ライブラリがそれらをインストールします)。 - 初回のアップロード時は 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"
このスクリプトは次の処理を行います。
UPLOAD_META.mdを読み込み、各## NN · filename.mp4ブロックを--dir内の動画ファイルに対応付けます--results-file(デフォルトは<dir>/.youtube_upload_results.json)に記録済みの動画はスキップします。失敗後に再実行しても安全です- 8 MB ごとに進捗を表示しながら、順番にアップロードします
- 最終的な 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"
よく使うオプション
| オプション | デフォルト | 説明 |
|---|---|---|
--privacy | public | private/unlisted/public |
--category | 28 | 28 = 科学・技術。27 = 教育。24 = エンターテインメント。 |
--made-for-kids | false | YouTube ではこの申告が必要です |
--playlist <ID> | なし | アップロードした各動画を再生リストに追加します |
--publish-at <ISO8601> | なし | 公開を予約します(--privacy private が必要です) |
--credentials | ~/.config/youtube/credentials.json | OAuth クライアントの JSON ファイル |
--token | ~/.config/youtube/token.json | キャッシュ済みの OAuth トークン |
--chunk-mb | 8 | アップロードが途中で失敗し続ける場合に、より小さいチャンクを指定します |
--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 を受け取るか、再生リストを作成してよいか確認する必要があります)