Community程式設計與開發github.com

RolynTrotter/vibe-podcast

從節目的Apple Motion範本製作每集播客圖形(主標題卡、引用下三分之一),並透過FCPXML將它們放入Final Cut Pro。

vibe-podcast 是什麼?

這個技能自動化為播客劇集生成動態圖形的流程,直接從Apple Motion範本(.motn / .moti 檔案)建立主標題卡和引用下三分之一,並將其無縫整合到Final Cut Pro中。它特別適用於處理Apple Motion本身缺乏AppleScript支援和命令列渲染器的情況,透過將Motion檔案視為XML(ozml)操作,並生成Final Cut Pro可理解的FCPXML來觸發渲染。 **為什麼有用:** 它消除了重複的手動輸出和導入工作,讓AI代理能夠根據JSON提示(指定範本、時間軸位置、文字覆蓋)直接生成最終成果。這特別適合在Final Cut Pro中處理複雜動畫、多圖層範本(例如帶有作者、標題、日期的引用下三分之一)、甚至是帶有動畫元素的標題卡。 **支援的平台與運作方式:** 該技能專為macOS上的Apple Motion 5.9+和Final Cut Pro 11.0.1+設計。它透過一組Python工具(`agent-motion/`中的 `motionkit.py` 和 `titles_fcpxml.py`)運作。使用者(或AI代理)可以檢查範本的圖層、設定文字、預覽影格,並生成FCPXML。零點擊導入功能可將結果直接推送到Final Cut Pro資料庫背景導入。它也支援讀取和修改動畫關鍵影格,並透過螢幕截圖在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 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

播客動態圖形

Motion 5.9 沒有 AppleScript 辭典,也沒有命令列渲染器。此處所有功能均透過將 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 在背景(open -g)於 Motion 中開啟以進行 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/<名稱>/<名稱>.moti)。兩個主要範本的快照位於 agent-motion/*.motn。

  • TF_Podcast_title:主標題卡,5 秒,29.97 fps,1080p。文字圖層: Tiersias Foundation Podcast(顯示「Tiresias Foundation Podcast」;圖層名稱有錯字,請繼續將其用作鍵名)和 Episode 4: Carl Schmitt(每集台詞,Futura Medium)。它發佈一個「拖放區」。
  • Citation v2:用於引言和來源的下三分之一,PT Serif 字型。文字圖層: ~Author Lastname(斜體;節目會加上前綴 ~)、Person Writes Silly Headline to (作品標題,可能兩行)、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 會顯示 資料庫選擇器,因此留給使用者操作。標題會連接到一個空隙上方,以便它們 可以被複製到實際的編輯中。

對於一次性嵌入的卡片(例如縮圖或 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 文件中的文字圖層順序。 已確認:Citation v2 的作者、標題、日期和出版行都會落在正確的欄位。
  • 傳送純文字(預設的 --style none)。 這樣範本會保留其自身的字型、大小、顏色 和陰影。--style font 會傳送包含系列/字體/大小的 text-style-def。任何樣式定義 都會覆蓋範本,而在加入 48 的回退值之前,沒有 Size 參數(Motion 預設為 48)的圖層會顯得很小。只有在刻意重新設定樣式時才使用 --style font。
  • 主標題卡(TF_Podcast_title)導入時動畫保持完整。
  • 透過在 com.apple.FinalCut 上執行 app_screenshot 來讀取 FCP 狀態:點擊事件,然後點擊 瀏覽器中的專案圖示(雙擊名稱會啟動重新命名,因此請按 Escape),然後點擊時間軸。

檢視與渲染(已於 2026-10-18 驗證)

  • 預覽幀: motionkit.py preview FILE --at T --open,然後在 Motion(bundle com.apple.motionapp)上使用電腦操作 app_screenshot,接著放大畫布。 透過 app_menu File > Close 關閉視窗。從背景在 Motion 的播放頭欄位中輸入文字不會移動播放頭。<currentFrame> 副本是可靠的方法。
  • 渲染: 電腦操作無法按下 檔案 > 共享(輸出影片、儲存目前影格)。 請要求使用者點擊「輸出」。Shell 的 screencapture 沒有螢幕錄製權限。
  • 絕不單獨使用 open -a 而不加 -g。使用者正在同一個螢幕上工作。

動畫(XML 暴露的內容)

關鍵影格是任何參數(變換位置/旋轉/縮放、混合不透明度、濾鏡參數)下的 curve > keypoint{time, value, in/out tangents}。行為(Gather In、筆速/壓力)是它們自己的節點,具有時間和控制參數。因此我們可以讀取完整的編排,並以程式方式重新定時、偏移或加入關鍵影格。然後透過預覽和截圖來檢查。 TF_Podcast_title 編排:Tiresias 圖形(群組 1/2)從 ±400 px 滑入到 1.5 秒,然後擺動 ±10 px / ±2° 到 4.87 秒。蛇形圖像對在 1.74 秒彈入(縮放 0.17→0.62 到 2.1 秒,由圓角矩形遮罩),並在關鍵影格 2.1/3.17/4.14/4.87 秒之間猛撲。標題行在 1.5–1.7 秒淡入,伴隨從 1.0 秒開始的 Gather In,而劇集行則在 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.

相關技能