Communityコーディング&開発github.com

RolynTrotter/vibe-podcast

ポッドキャストのエピソードごとに、Apple Motion テンプレートからグラフィック(メインタイトルカード、引用・出典用のローワーサード)を生成し、FCPXML を介して Final Cut Pro に配置します。タイトルカード、引用・ローワーサード、オンスクリーンテキスト、または .motn/.moti ファイルや Motion に関する依頼があった場合に使用します。

vibe-podcast とは?

このスキルは、ポッドキャスト制作のワークフローを自動化するためのツール群を提供します。Apple Motion 5.9 には AppleScript や CLI レンダラーが存在しないため、Motion ファイルを XML (ozml) として直接操作し、Final Cut Pro がレンダリング可能な FCPXML を生成することで、タイトルカードやローワーサード(引用・出典表示)をエピソードごとに動的に作成します。 主な機能として、`motionkit.py` ツールチェインが Motion ファイルのテキストレイヤーやアニメーションキーフレームの読み取り・書き換え・プレビューを行い、`titles_fcpxml.py` が JSON 形式のキューリストを FCPXML プロジェクトに変換します。これにより、FCP ライブラリへのゼロクリック読み込みが可能で、テンプレートのフォントやアニメーションを維持したまま、テキストのみを差し替えることができます。 対応プラットフォームは Apple Motion 5.9 以降 と Final Cut Pro 11.0.1 以降(macOS)。ワークフローは inspect → cue JSON 作成 → FCPXML 生成 → ライブラリ読み込み というシンプルな流れで、Motion の XML 構造(テキストコンテンツ、スタイル、キーフレーム、ベヘイビアなど)を深く理解した上で設計されています。 このスキルの価値は、GUI 操作が難しい Motion ファイルのプログラム的な操作と、FCP とのシームレスな連携を実現する点にあります。例えば、`set-text` コマンドでテキストレイヤーを書き換える際、UTF-16 のスタイル長を自動調整するため、Motion が読み込みに失敗する問題を回避します。また、アニメーションのキーフレームやベヘイビアも読み取り可能であり、プレビュー生成やスクリーンショット取得による視覚的確認もサポートしています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/RolynTrotter/vibe-podcast/tree/HEAD/.claude/skills/motion-graphics

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

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

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

ドキュメント

ポッドキャスト用モーショングラフィックス

Motion 5.9 には AppleScript 辞書も CLI レンダラーもありません。ここで行う処理はすべて、Motion ファイルを XML (ozml) として扱い、Final Cut Pro がレンダリングを行う FCPXML を生成することで実現しています。Final Cut がレンダリングを担当します。

ツールは agent-motion/ にあります:

ツール機能
motionkit.py inspect FILE [--json]レイヤー構造、テキストレイヤー(テキスト/フォント/サイズ/位置)、タイミング(秒)、FCP に公開されている項目、メディア参照を表示
motionkit.py set-text IN OUT --set "KEY=TEXT" ...テキストレイヤーを書き換えます。KEY はレイヤー ID、レイヤー名、または現在のテキストを指定。\n で改行。styleRun の長さ(UTF-16)を自動調整するため Motion がエラーを起こしません
motionkit.py keyframes FILE [--grep X] [--all]すべてのアニメーションパラメーターとそのキーフレーム時間・値を表示(回転はラジアン)
motionkit.py preview FILE --at 1.9 3.2 [--open]指定した時間にファイルをコピーして書き出します。--open を付けると Motion でバックグラウンドで開きます(open -g)。app_screenshot によるスクリーンショット取得に使用
motionkit.py install FILE --name NAMEプロジェクトを Motion のタイトルフォルダに FCP タイトルテンプレートとしてコピー
titles_fcpxml.py SPEC.json -o OUT.fcpxmlキューリスト → タイトルが適切な時間・テキストで配置された FCPXML プロジェクトを生成

番組のテンプレート

インストール先: ~/Library/Containers/com.apple.motionapp/Data/Movies/Motion Templates.localized/Titles.localized/Templates/ (FCP での UID 形式: ~/Titles.localized/Templates/<Name>/<Name>.moti)。メインの 2 つのテンプレートのスナップショットは agent-motion/*.motn にあります。

  • TF_Podcast_title: メインタイトルカード、5 秒、29.97fps、1080p。テキストレイヤー: Tiersias Foundation Podcast(表示は「Tiresias Foundation Podcast」; レイヤー名にタイポがありますが、そのままキーとして使用してください)と Episode 4: Carl Schmitt(エピソードごとの行、Futura Medium)。1 つのドロップゾーンを公開しています。
  • Citation v2: 引用と出典用のローワーサード、PT Serif。テキストレイヤー: ~Author Lastname(イタリック; 番組では先頭に ~ を付けます)、Person Writes Silly Headline to (作品のタイトル、2行になる場合あり)、20 Apr, 1969(日付)、Publication。
  • Citation v2 no pub: 上記から出版元の行を除いたもの。他にも Citation v1、Black/Orange/Yellow/PeeTitle、Minister_Types があります。

過去の使用例(Podcast3/4 ライブラリより): Timothy Snyder、Carl Schmitt、Xunzi、 ~Eric L. Hutton, trans.、~Armando Iannucci, dir.、95 U.S. 602。翻訳者や監督には役割の接尾辞を付けます。裁判例は著者スロットに入れます。

ワークフロー

  1. python3 agent-motion/motionkit.py inspect "<template>.moti" でテキストレイヤーのキーを取得します。
  2. キュー JSON を記述します(agent-motion/examples/ep_demo.json を参照): テンプレート、at(エピソードタイムライン上の秒数)、オプションの duration、texts マップ。
  3. python3 agent-motion/titles_fcpxml.py cues.json -o titles.fcpxml を実行し、検証します: xmllint --noout --dtdvalid <FCPXMLv1_11.dtd のコピー> titles.fcpxml。DTD は /Applications/Final Cut Pro.app/Contents/Frameworks/Interchange.framework/Versions/A/Resources/ にあります。 まずコピーしてください。xmllint はスペースを含むパスで失敗するためです。
  4. 読み込み: --library <bundle> --push を追加します(ゼロクリック)。--library なしの場合、FCP はライブラリ選択ダイアログを表示しますので、ユーザーに任せてください。タイトルはギャップの上に接続されて配置されるため、実際の編集にコピーできます。

1回限りのベイク済みカード(サムネイルや、FCP ではオーバーライドできないスタイル変更が必要なカードなど)の場合は、.motn に対して set-text を使用し、open -g -a Motion OUT.motn でユーザーが目視確認または書き出しを行えるようにします。

FCP 11.0.1 (2026-10-18) で検証済み

  • ゼロクリックインポートは動作します: titles_fcpxml.py cues.json -o x.fcpxml --library path/To.fcpbundle --push は <import-options>(ライブラリの場所、アセットのリンク、警告の抑制)を追加し、open -g で送信します。 FCP はバックグラウンドでインポートし、ライブラリがない場合は作成します。テストには scratch/fcp-test/ 以下の使い捨てライブラリを使用し、ユーザーの実際のライブラリを許可なく使用しないでください。
  • <text> の順序 = Motion ドキュメント内の Text レイヤーの順序です。 確認済み: Citation v2 の著者、見出し、日付、出版元がすべて正しいスロットに配置されます。
  • プレーンテキストを送信します(デフォルトの --style none)。 これによりテンプレート自身のフォント、サイズ、色、シャドウが維持されます。--style font は text-style-def を送信し、ファミリー/フェイス/サイズを指定します。スタイル定義はテンプレートを上書きし、Size パラメーターがないレイヤー(Motion デフォルト 48)は、48 のフォールバックが追加されるまでは非常に小さく表示されていました。--style font は意図的にスタイルを変更する場合にのみ使用してください。
  • メインタイトルカード(TF_Podcast_title)はアニメーションを維持したままインポートされます。
  • FCP の状態は com.apple.FinalCut の app_screenshot で読み取ります: イベントをクリックし、ブラウザ内のプロジェクトアイコンをクリックします(名前をダブルクリックすると名前変更が始まるので、Escape キーを押します)、そしてルーラーをクリックします。

表示とレンダリング(2026-10-18 検証済み)

  • プレビューフレーム: motionkit.py preview FILE --at T --open を実行し、computer-use で Motion(バンドル com.apple.motionapp)の app_screenshot を取得し、キャンバスを拡大表示します。app_menu File > Close でウィンドウを閉じてください。バックグラウンドから Motion の再生ヘッドフィールドに入力しても再生ヘッドは移動しません。<currentFrame> コピーが信頼できる方法です。
  • レンダリング: computer-use では File > Share(Export Movie、Save Current Frame)を押せません。ユーザーに Export をクリックするよう依頼してください。シェルの screencapture には画面収録の許可がありません。
  • -g なしで open -a を実行しないでください。ユーザーは同じ画面で作業しています。

アニメーション(XML で公開されているもの)

キーフレームは任意のパラメーター(Transform Position/Rotation/Scale、Blending Opacity、フィルターパラメーター)の下にある curve > keypoint{time, value, in/out tangents} です。ベヘイビア(Gather In、Pen Speed/Pressure)は独自のノードとして存在し、タイミングと Controls パラメーターを持ちます。したがって、完全な動きを読み取り、プログラムでタイミングの変更、オフセット、キーフレームの追加が可能です。その後、プレビューとスクリーンショットで確認します。 TF_Podcast_title の動き: Tiresias のフィギュア(Group 1/2)が ±400 px から 1.5 秒かけてスライドインし、その後 4.87 秒まで ±10 px / ±2° で揺れます。蛇の画像ペアは 1.74 秒でポップインし(スケール 0.17→0.62、2.1 秒まで、角丸長方形でマスク)、2.1/3.17/4.14/4.87 秒のキーフレーム間で動きます。タイトル行は 1.5~1.7 秒でフェードインし、Gather In が 1.0 秒から、エピソード行は 2.37 秒で Gather In します。

ozml に関する注意事項

  • 時間は "value timescale flags epoch" の形式です。秒 = value / timescale。
  • テキストコンテンツ: scenenode[factory=Text] > parameter[name=Object] > parameter[id=369] > text。 スタイルは styleRun style=ID offset length で指定されるため、長さが一致しないとスタイルが壊れます。
  • 先頭のファクトリーテーブルで factoryID → 種類(Text、Shape、Replicator、Image...)がマッピングされています。ID はファイルごとに異なるため、常にファクトリーテーブルを通して解決してください。
  • Apple の(古いですが、ほとんどは正しい)リファレンス: developer.apple.com アーカイブの Motion XML ガイド。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

関連スキル