Communitygithub.com

beachyphotoandfilm-arch/video-skills

DaVinci Resolve から完成したリールをレンダリングし、クリエイターの声でキャプションを作成し、カスタム Instagram カバーを添付して、Metricool を通じて Instagram、TikTok、YouTube Shorts にスケジュール投稿します。Google Drive アップロード処理、既存カレンダーとの重複チェック、クリーンアップを自動化します。

video-skills とは?

このスキルは、DaVinci Resolve で編集されたリール動画を自動的にレンダリングし、クリエイターの話し言葉のトーンやスタイルに合わせたキャプションを生成し、専用のカバー画像を添付して、Instagram、TikTok、YouTube Shorts にスケジュール投稿するための包括的なソリューションです。Metricool の API を利用して、公開 URL のみを受け付ける制約を Google Drive の共有フォルダ経由で解決し、アップロード、スケジュール、投稿後のクリーンアップまでを自動化します。さらに、スケジュール時に既存のカレンダーと重複しないように調整し、ドラフト機能を使ってテスト投稿を安全に行うことも可能です。このスキルは Claude、Cursor、Codex などの AI エージェント向けに設計されており、コマンドラインや API 呼び出しを介して実行されます。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/beachyphotoandfilm-arch/video-skills/tree/HEAD/skills/schedule-social

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

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

ドキュメント

ソーシャルにスケジュール投稿

セットアップ:以下の項目を入力

初回実行前に、以下のプレースホルダーをすべて置き換えてください。

プレースホルダー説明
<YOUR_METRICOOL_BLOG_ID>Metricool ブランドの blogId(getBrandSettings から取得)
<YOUR_TIMEZONE>スケジュール用の IANA タイムゾーン(例:America/Chicago)
<YOUR_POST_TIME>デフォルトの投稿時間(例:10:00)
<YOUR_IG_HANDLE>、<YOUR_TIKTOK_HANDLE>、<YOUR_YOUTUBE_CHANNEL_ID>Metricool に接続されたアカウント
<YOUR_DRIVE_UPLOAD_FOLDER_ID>「リンクを知っている全員」に共有された Google Drive フォルダ(メディアホップ参照)
<YOUR_VIDEO_LIBRARY>完成ファイルの保存先(例:~/Videos/Finished)
<YOUR_STANDING_CTA>すべてのキャプションに追加するオプションの定型文
<YOUR_VOICE_FILE>オプション:キャプション用の音声/スタイルガイドのパス

ブランド: blogId <YOUR_METRICOOL_BLOG_ID>、タイムゾーン <YOUR_TIMEZONE>。 接続済み: Instagram(<YOUR_IG_HANDLE>)、TikTok(<YOUR_TIKTOK_HANDLE>)、YouTube(<YOUR_YOUTUBE_CHANNEL_ID>)。

メディアホップ(わかりにくい部分)

Metricool の API は 公開 URL のみ を受け付けます。ローカルファイルは受け付けられません。処理の流れは以下の通りです。

  1. MP4 を Metricool Uploads (Claude)(<YOUR_DRIVE_UPLOAD_FOLDER_ID>)などの Drive フォルダにアップロードします。フォルダを「リンクを知っている全員」に一度共有すれば、ファイルはその権限を継承するため、ファイルごとに共有する必要はありません。
    cd <ファイルのあるディレクトリ> && gws drive files create \
      --params '{"uploadType":"multipart","supportsAllDrives":true}' \
      --json '{"name":"<名前>.mp4","mimeType":"video/mp4","parents":["<YOUR_DRIVE_UPLOAD_FOLDER_ID>"]}' \
      --upload "<ファイル>"
    
  2. 直接ダウンロード URL を使用してスケジュールします:https://drive.google.com/uc?id=<fileId>&export=download。 /view リンクは「メディアの正規化に失敗しました」というエラーで失敗します。
  3. Metricool がファイルを自社のストレージにコピーします。レスポンスの media は static.metricool.com/... に変わります。
  4. それを確認したら Drive のコピーを削除 します。ストレージが蓄積されることはありません。

Claude は通常、Drive ファイルを公開できず(サンドボックスでブロックされる)、自身の権限を編集できません。そのため、共有フォルダが存在します。ファイルがフォルダ外にある場合は、共有しようとせずにユーザーに移動を依頼してください。

キャプション

音声ガイドを保持している場合は、最初に <YOUR_VOICE_FILE> を読み、それに合わせてください。それ以外の場合は以下のデフォルトを使用します。

リールにコメントキーワード CTA(自動 DM やメールをトリガーするキーワード)がある場合、1行目は CTA です。

  • 1行目: Comment <KEYWORD> and I'll send you <リソース名> free 👇(キーワードは大文字で、リールの CTA クリップで話されている通りに)
  • 次に フック行と、以下の 2〜4 行の教育行。
  • 最後に 定型 CTA を(使用する場合)付ける。
  • キーワードはリールで話されている CTA(動画の状態ファイルの reel_cta)と一致する必要があります。動画ごとに1つのキーワード。

キーワード CTA がないリールの形式:

  • 1行目はフック。 フィードで表示される唯一の行。通常、リールの冒頭と同じ行。
  • 2〜4行の短い行で1つのことを教える。段落ではなく、行間に改行。
  • ハッシュタグのスパムは避ける。少数またはなし。
  • 定型 CTA がある場合は、そのまま <YOUR_STANDING_CTA> で締めくくる。

実際のリールの内容から、トランスクリプト内のクリエイターの言葉を使って書き、一般的なアドバイスは使わない。短いが教育的:視聴者はキャプションだけで1つの使えることを学べるように。

一般的な形状の例:

「毎日投稿=バーンアウト / 週に3本の素晴らしい動画を投稿=成長」

「より良いオーディオを得るための簡単なヒント:ゲインを上げるのではなく、マイクを近づけてください...」

レンダリング

キャプションは焼き込み済み:video-reels はそれらを V3 にアルファオーバーレイクリップとして配置し、テキストフックカードは V2 に配置します。インポートも焼き込みチェックボックスも不要。

  1. ユーザーがリールをトリミングします。両方のオーバーレイトラックは独立したクリップであるため、V1 をトリミングしてもそれらは移動しません。タイミングを再カットした場合は、スライドさせるのではなく、そのリールのキャプションを再レンダリングします。
  2. Claude が Resolve API を通じてレンダリングします。4つのリールで約90秒かかります。
out = os.path.expanduser("~/Movies/<video>-deliverables/reels-final")
os.makedirs(out, exist_ok=True)
project.DeleteAllRenderJobs()
for i in range(project.GetTimelineCount()):
    t = project.GetTimelineByIndex(i+1)
    if not t.GetName().startswith("Reel"):
        continue
    project.SetCurrentTimeline(t)
    project.SetRenderSettings({"TargetDir": out, "CustomName": t.GetName().replace(" ", "_"),
                               "SelectAllFrames": True, "FormatWidth": 1080, "FormatHeight": 1920,
                               "ExportVideo": True, "ExportAudio": True})
    project.SetCurrentRenderFormatAndCodec("mp4", "H264")
    project.AddRenderJob()

その後 start_rendering。コーデック文字列は "H264" であり、"H.264" ではありません。フォーマットは "mp4" です。ジョブステータスではなく出力ディレクトリをポーリングします。ファイルは完了すると表示されます。30秒で約40MBを見込んでください。 3. レンダリングはタイミングの後戻りできないポイントなので、まずトリミングを行ってください。 4. アップロード前に ffmpeg で出力をスポットチェックし、フックウィンドウ内の1フレームとリール中央の1フレームを確認します:

ffmpeg -v error -ss 1.5 -i reel.mp4 -frames:v 1 hook.png -y
ffmpeg -v error -ss 8   -i reel.mp4 -frames:v 1 cap.png  -y

それらを1つのプルーフシートにまとめて、実際に確認します。ここがフックカードの欠落や空白のキャプショントラックをキャッチできる最後の場所であり、スケジュール後は削除できません。

完成ファイルの保存先

すべての保持ファイルは <YOUR_VIDEO_LIBRARY>/ に、動画ごとに1つのフォルダとして保存されます:

<YOUR_VIDEO_LIBRARY>/<動画名> YYYY-MM-DD/
    Reels/              投稿されたもの。1080x1920 H.264
    Reels/Masters/      同じカット、60 Mbps アーカイブ
    Timelines/          タイムラインごとの .drt + プロジェクト .drp
    Covers/             承認された Instagram リールカバー、1080x1920 JPG
    Thumbnails/         フルサイズのサムネイルオプション
    YouTube/            エクスポートされた長尺動画、配信用+マスター
    Posting schedule.txt   何が、どこに、いつ投稿されるか

アップロードファイル:Instagram の公開APIが許可する最大品質

Metricool は Meta のコンテンツ公開APIを通じて投稿します。そのAPIには上限があります。その上限内に収まる最高のファイルを、60 Mbps マスターから(Resolve の配信レンダリングからではなく)作成します:

  • H.264 High, yuv420p, 1080x1920, closed GOP, moov を先頭に(+faststart)
  • ビデオ 24 Mbps 最大(上限は 25)、オーディオ AAC 128 kbps、48 kHz(Resolve は 320 kbps を書き込むため超過)
  • ビデオとオーディオストリームのみ。 Resolve はタイムコードデータトラックを追加するため、-dn で削除します
ffmpeg -i "Masters/<n>.mp4" -map 0:v:0 -map 0:a:0 -map_metadata -1 -dn \
  -c:v libx264 -preset slow -crf 11 -maxrate 24M -bufsize 48M -pix_fmt yuv420p -profile:v high \
  -g 48 -keyint_min 48 -sc_threshold 0 -flags +cgop \
  -c:a aac -b:a 128k -ar 48000 -movflags +faststart "Reels/<n>.mp4"

CRF 16 でもトーキングヘッド映像は約 8 Mbps しか使用しなかったため、CRF 11 で予算をより多く使います。-preset slow では数分かかるため、バックグラウンドで実行します。ファイルを並列ではなく、一度に1つエンコードします: 多数の並列エンコードは書き込み中にディスクを満たし、すべてのファイルを切り詰める可能性があります。Instagram は独自の再圧縮を行うため、これにより開始時の品質が許容範囲内で最もクリーンであることを確認します。

リールごとに2つのレンダリング、1つではありません。 同じコーデック、同じ解像度、異なるビットレート:

解像度ビットレート用途
配信1080x1920 H.264Resolve パス、その後上記のアップロードファイルに置き換えアップロード用
マスター1080x1920 H.26460 Mbps("VideoQuality": 60000 経由)アーカイブ用

長尺動画も 1920x1080 で同じ2パス:10分の動画で約900MBの配信、約4.5GBのマスター。

1080x1920 が適切な解像度です:Instagram は関係なく 1080 幅で配信し、リールのクロップはすでに 4K からオーバーサンプリングされています。特に依頼がない限り、ProRes やより大きなフレームは提供しないでください。

VideoQuality は固定されます。パスごとに毎回設定してください。

レンダリング設定はプロジェクトに保存され、ジョブには保存されません。SetRenderSettings 呼び出しで VideoQuality を省略すると、レンダリングは以前の設定を静かに再利用します。リールマスターから 60000 を継承した長尺配信パスは、意図したよりも約5倍大きくなります。

project.SetRenderSettings({..., "VideoQuality": 12000})   # 配信、約12 Mbps
project.SetRenderSettings({..., "VideoQuality": 60000})   # マスター、約60 Mbps

配信パスではデフォルトに決して依存しないでください。そしてジョブリストを決して信頼しないでください: VideoQuality は、適用された場合でも GetRenderJobList() から None として読み戻されます。完成ファイルを確認してください:

ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of csv=p=0 out.mp4

長尺ペアをキューに入れる前に空き容量を確認してください。 60 Mbps で10分のマスターは約4.5GBです。

タイムラインもフォルダにエクスポートして、プロジェクトデータベースなしで編集を portable にします:

for i in range(project.GetTimelineCount()):
    t = project.GetTimelineByIndex(i+1)
    t.Export(os.path.join(d, t.GetName() + ".drt"), resolve.EXPORT_DRT)
resolve.GetProjectManager().ExportProject(project.GetName(), os.path.join(d, project.GetName() + ".drp"))
  • 直接レンダリングします。 Resolve の TargetDir を <そのフォルダ>/Reels に設定し、後で移動する必要がないようにします。
  • Resolve のタイムライン名からリネームします。 Reel_2_-_my_best_tip.mp4 は 2. my best tip.mp4 になります:番号順でソートされ、一目で読めるようになります。マスターと .drt ファイルも同じ名前にして、3つのフォルダが揃うようにします。
  • コピーではなく移動します。 ~/Movies/<video>-* には作業ファイル(Whisper JSON、SRT、オーバーレイ mov、キャプション mov)が含まれます。これらは再レンダリングのためにそのまま残し、完成したエクスポートのみ移動します。
  • スケジュール後に Posting schedule.txt を書き込み、各リールの日付、時間、ネットワークを一覧表示して、ユーザーが Metricool を開かなくても何が出荷されたか確認できるようにします。

ディスク容量については、レンダリングが実際に容量不足で失敗した場合、または長尺ペアが明らかに収まらない場合にのみ言及してください。

カバー(Instagram のみ)

すべてのリールには、スケジュール前にカスタム Instagram カバーが設定されます。キャプションが承認された後、スケジュール前に reel-covers スキルを実行してください。 リールごとに承認された1つの JPG が <Video>/Covers/ に返されます。キャプションとスロットと同じゲートでカバーを表示し、すべてが1回の承認で完了するようにします。

各カバーを動画と同じ Drive ホップ(同じフォルダ <YOUR_DRIVE_UPLOAD_FOLDER_ID>、mimeType: image/jpeg)を通じてアップロードし、videoThumbnailUrl として uc?id=...&export=download 形式で渡します。Metricool が独自のコピーを取得したら、動画と同様に Drive コピーを削除します。

スケジュール設定

リールごとに1つの投稿、3つのネットワークすべて、カバーを含む。 カバーは Instagram でのみ重要です。TikTok は個人アカウントでは無視し、Shorts は確認済みチャンネルでのみ表示します。投稿を分割しないでください。

"providers":[{"network":"instagram"},{"network":"tiktok"},{"network":"youtube"}],
"media":["https://drive.google.com/uc?id=<video id>&export=download"],
"videoThumbnailUrl":"https://drive.google.com/uc?id=<cover id>&export=download",
"instagramData":{"type":"REEL","showReelOnFeed":true,"isAiGenerated":false},
"tiktokData":{"privacyOption":"PUBLIC_TO_EVERYONE","title":"<short title>"},
"youtubeData":{"type":"short","privacy":"public","madeForKids":false,"title":"<title, <100 chars>"}
  • 既にスケジュールされた投稿にカバーを追加する場合: updateScheduledPost に投稿の完全な元のフィールド(テキスト、プロバイダー、メディア、すべてのネットワークデータ、日付)と videoThumbnailUrl を指定します。上書きされ、元に戻せないため、getScheduledPosts からフィールドをそのままコピーしてください。既存の videoThumbnailUrl または videoCoverMilliseconds を決して置き換えないでください: いずれかがある投稿は、すでに選択されたカバーがあります。
  • 1つの更新が "Failed to normalize media" で失敗し、他が成功した場合、その Drive からの取得が一度失敗したものです。投稿は変更されません。ファイルを再アップロードして(新しい ID)、再試行してください。同じ URL を再試行しても役に立ちません。
  • 次に、getScheduledPosts ですべての投稿の videoThumbnailUrl が static.metricool.com で始まることを確認し、Drive コピーを削除します。
  • YouTube はタイトルと madeForKids を必要とします。 TikTok は短いタイトルを必要とします。
  • autoPublish: true により、Metricool が自動的に投稿します。

スケジュールするタイミング(デフォルトルール、必要に応じて調整)

今日の翌日から開始します。1日1投稿。既にコンテンツがある日は、次の空いている日に移動します。

day = 明日
for each post in order:
    while day already has a scheduled post:  day += 1
    schedule at <YOUR_POST_TIME> local on day
    day += 1
  • <YOUR_TIMEZONE> の <YOUR_POST_TIME> がデフォルトの投稿時間です。
  • 常に最初に getScheduledPosts を呼び出し、明日から明日 +(投稿数 + 14日)までをカバーして、空き状況を確認します。このチェックをスキップすると、既に埋まっているスロットに投稿が配置される可能性があります。
  • その日に何か(下書きを含む)がスケジュールされている場合、その日は埋まっていると見なされます。
  • 複数の投稿を1日に詰め込まず、穴を残さないでください:目的は即座に開始する安定した毎日の連続投稿です。
  • キャプションテキストにテストラベルを決して入れないでください。 「TEST DRAFT」、「safe to delete」などは禁止です。キャプションは常に完成したコピーであり、テスト実行であっても同様です。ユーザーはそれを保持したい場合があります。 テスト投稿は draft: true + autoPublish: false でマークしてください(下書きはプランナーで視覚的に区別されます)。そして、plannerUrl と投稿 ID を渡して、1回のクリックで削除できるようにします。

長尺 YouTube(メイン動画、Short ではない)

推奨:大きな長尺ファイルは Metricool で送信しないでください。YouTube Studio でアップロードしてください。 Metricool を通じて送信された約1GBのエクスポートは、転送中に切り詰められた状態で保存される可能性があります。Resolve は MP4 インデックス(moov)をファイルの末尾に配置するため、切り詰められたコピーは読み取り不可能になり、YouTube は既に「公開」された後に「処理が中止されました」と報告します。Metricool はエラーを報告しない場合があります。ファイル、タイトル、説明、サムネイルを Studio に貼り付けるためにユーザーに渡し、4K でレンダリングします(Studio にはサイズ問題はありません)。以下のすべては参考用に保持されています。

Metricool を大きなファイルに使用する場合は、保存されたメディアのサイズを確認してください...

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

beachyphotoandfilm-arch/video-skills

Sync camera footage to a separate lapel or field-recorder track (e.g. Tascam DR-10L and similar) and lay it up in DaVinci Resolve. Stitches the recorder's split files, finds each clip's exact place in the audio by matching words then waveforms, cuts one lapel slice per clip so every later skill works unchanged, checks for clipping, and builds a synced timeline in a new Resolve project. Trigger on "sync the lapel", "sync my audio", "line up the recorder", "I used a lav", or any shoot with a separate audio folder (live talks, events, workshops). Run it before paper-edit or video-reels.

beachyphotoandfilm-arch/video-skills

Turn raw talking-head footage into an assembled rough cut inside DaVinci Resolve. Pulls the clips off your footage drive, transcribes them locally, removes failed takes, restarts, asides and dead air, then creates a new Resolve project with two paper-edit timelines ready for your fine trim. Trigger on "paper edit", "cut my raw footage", "make a rough cut", "clean up this video", or when the user points at a folder of raw camera files for a YouTube video.

beachyphotoandfilm-arch/video-skills

Design a unique Instagram cover for each reel in your house style. Reads what the reel is about, writes a short hook headline, picks one of your own photos from a tagged photo library, lays it out like your existing covers, and proofs it in grid view at phone size. Renders locally, never with AI image generation. Can be called by a scheduling skill before reels are scheduled. Trigger on "make covers", "reel covers", "cover photo for this reel", "design the IG covers".

beachyphotoandfilm-arch/video-skills

Build animated brand overlays (motion graphics) for a talking-head video, timed to the speaker's exact words, plus a DaVinci Resolve import file. House style is in-scene type (text beside and behind the speaker's head) plus diagrams. Transcribes the rough cut locally, picks the moments, renders transparent .mov clips, and writes an FCPXML that drops every clip onto the timeline already in position. Trigger on "make animations for this video", "add overlays/motion graphics", "animate this", "b-roll graphics for my YouTube video", or when the user shares a rough cut and asks for graphics.

beachyphotoandfilm-arch/video-skills

Cut vertical Instagram reels out of a long-form talking-head video, hook first. Picks the strongest standalone moments from the transcript, opens each reel on its punchiest line, builds vertical timelines in DaVinci Resolve framed on the speaker's face with the LUT applied, and finishes them: a hook (a held text card, or a word-by-word "build" hook with punch-in) and burned-look captions on V3; this-or-that reels get product graphics and a comment-keyword CTA card. You trim and render, nothing to import. Trigger on "make reels", "clip this for Instagram", "cut some verticals", or after a YouTube video is cut.

beachyphotoandfilm-arch/video-skills

Design YouTube thumbnails and titles for a talking-head video. Pulls graded full-res frames out of the raw footage, renders brand-styled variants in two proven layouts, and proofs them at phone size where the click actually gets decided. Trigger on "make thumbnails", "thumbnail for this video", "title and thumbnail", or after a video is cut.

beachyphotoandfilm-arch/video-skills

Run the whole YouTube video pipeline end to end, one stage at a time, stopping for the creator's approval at every gate. Paper edit, punch-ins, reels, reel covers, scheduling the reels, overlays, thumbnail and title, then scheduling the long-form video, all through Metricool. Keeps state per video so you can stop anywhere and pick up later. Trigger on "/youtube", "let's do the whole video", "run the video pipeline", "continue the <name> video", or when handed raw footage for a YouTube video.

関連スキル