fcp-titles — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fcp-titles (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<title> 要素は FCPXML 1.13 で Basic Title (Motion テンプレ) を使ったテキストオーバーレイ。字幕、テロップ、ロケーションカードのテキスト部分などに使う。
9999/999166631/999166633/...、 Typewriter は 9999/10986/10988/...。keyを付け替えないと param が無視されるtext-style.fontSize 単独では効かない<resources>
<effect id="rN" name="Basic Title"
uid=".../Titles.localized/Bumper:Opener.localized/Basic Title.localized/Basic Title.moti"/>
</resources>
<spine>
<asset-clip ref="rX" offset="..." start="..." duration="...">
<!-- lane はプロジェクト固定ではない。画像オーバーレイと併用する典型スタックは fcp-image-overlay §6 の推奨を優先 -->
<title ref="rN" lane="3"
offset="<親asset-clip.start値>"
name="字幕#N"
start="108108000/30000s"
duration="<dur>">
<param name="Position" key="9999/999166631/999166633/1/100/101" value="0 0"/>
<param name="Flatten" key="9999/999166631/999166633/2/351" value="1"/>
<param name="Alignment" key="9999/999166631/999166633/2/354/999169573/401" value="1 (Center)"/>
<param name="Size" key="9999/999166631/999166633/5/999166635/3" value="50"/>
<text>
<text-style ref="tsM">字幕本文</text-style>
</text>
<text-style-def id="tsM">
<text-style font="Helvetica" fontSize="50" fontFace="Regular"
fontColor="1 1 1 1" alignment="center"/>
</text-style-def>
</title>
</asset-clip>
</spine>| 項目 | 真値 | 注意 |
|---|---|---|
| uid | Bumper:Opener.localized 配下 | Build In:Out.localized は誤り |
| 表示サイズ | <param name="Size"> | text-style.fontSize 単独では無効。両方同期する |
| 表示位置 | <param name="Position"> "x y" (1920基準pixel) | center=0 0、下端寄せはY=負値 |
| 整列 | <param name="Alignment"> "1 (Center)" | "0 (Left)" / "1 (Center)" / "2 (Right)" |
| Flatten | <param name="Flatten"> "1" | 2D平面化(3D効果なし)デフォルト |
| 配置 | 親 asset-clip の 子要素(lane は重なり回避で決める) | connected clip 扱い |
| offset | 親 asset-clip の start値と一致 | 親の先頭から表示開始 |
| duration | 親より長くてOK | 複数clipにまたがって表示可 |
| title.start | 108108000/30000s のまま | テンプレ内部時間軸、触らない |
字幕を開始時点から1文字ずつ打ち出す演出を入れたい時、 Basic Title ではなく Typewriter title を使う。 Build In:Out カテゴリ配下の別 effect なので、 effect定義・param key prefix・必須param がすべて Basic Title と異なる。
<resources>
<effect id="rN" name="Typewriter"
uid=".../Titles.localized/Build In:Out.localized/Typewriter.localized/Typewriter.moti"/>
</resources>
<spine>
<asset-clip ref="rX" ...>
<title ref="rN" lane="1"
offset="<親asset-clip.start値>"
name="字幕#N"
start="108108000/30000s"
duration="<dur>">
<param name="Position" key="9999/10986/10988/1/100/101" value="-820 -494"/>
<param name="Alignment" key="9999/10986/10988/2/354/1156452346/401" value="0 (Left)"/>
<param name="Opacity" key="9999/10986/10988/4/11030/1000/1044" value="0"/>
<param name="Animate" key="9999/10986/10988/4/11030/201/203" value="1 (Character (without spaces))"/>
<param name="Spread" key="9999/10986/10988/4/11030/201/204" value="0"/>
<param name="End Offset" key="9999/10986/10988/4/11030/201/213" value="120"/>
<text>
<text-style ref="tsM">Day 1 18:54 Colombo Bandaranaike Airport</text-style>
</text>
<text-style-def id="tsM">
<text-style font="Helvetica" fontSize="40" fontFace="Bold Oblique"
fontColor="1 1 1 1" bold="1" italic="1"/>
</text-style-def>
</title>
</asset-clip>
</spine>| param | key | 役割 |
|---|---|---|
Position | 9999/10986/10988/1/100/101 | 1920x1080基準pixel (Basic Title と同じ単位) |
Alignment | 9999/10986/10988/2/354/1156452346/401 | "0 (Left)" 等。末尾IDが Basic Title と異なる (999169573→1156452346) |
Opacity | 9999/10986/10988/4/11030/1000/1044 | "0" 初期値 (アニメ開始時) |
Animate | 9999/10986/10988/4/11030/201/203 | "1 (Character (without spaces))" でスペース以外を1文字ずつ |
Spread | 9999/10986/10988/4/11030/201/204 | "0" (タイピング間隔の散らばり) |
End Offset | 9999/10986/10988/4/11030/201/213 | typing 速度。 値↑ で typing が遅く (= 各文字の表示時間が長く) |
| 項目 | Basic Title | Typewriter |
|---|---|---|
| effect uid | Bumper:Opener.localized/... | Build In:Out.localized/... |
| key prefix | 9999/999166631/999166633/... | 9999/10986/10988/... |
| 必須/特有param | Flatten, Font | Animate, Opacity, Spread, End Offset |
| Alignment末尾 | 999169573/401 | 1156452346/401 |
key prefix を変えずに値だけ書き換えると param が反映されない。 そのまま import は通るが Inspector で見ると "default" 表示になる。
字幕#1 だけ FCP で手動で Typewriter に置換 → Export XML → 残り N-1 個に複製 が最短ルート。
TITLE_RE = re.compile(
r'<title ref="r4" lane="1" offset="(?P<offset>[^"]+)" name="(?P<name>字幕#\d+P)" '
r'start="(?P<start>[^"]+)" duration="(?P<duration>[^"]+)">\s*'
r'<param name="Position" key="9999/999166631/999166633/1/100/101" value="(?P<pos>[^"]+)"/>\s*'
r'<param name="Flatten" key="9999/999166631/999166633/2/351" value="1"/>\s*'
r'(?:<param name="Font" key="9999/999166631/999166633/5/999166635/83" value="[^"]*"/>\s*)?'
r'<text>\s*<text-style ref="(?P<tsid>ts\d+)">(?P<text>[^<]+)</text-style>\s*</text>\s*'
r'<text-style-def id="(?P=tsid)">\s*'
r'<text-style font="Helvetica" fontSize="40" fontFace="Bold Oblique" fontColor="1 1 1 1" bold="1" italic="1"/>\s*'
r'</text-style-def>\s*</title>',
re.DOTALL,
)ref を r4 → 動的取得した Typewriter id (上の例では r6) に差し替え、 param block を Typewriter 用に組み直す。 duration / start / offset / Position 値・text-style はすべて温存する。
End Offset="120" で 41文字 (例: Day 1 18:54 Colombo Bandaranaike Airport) を約 2-3秒 で打ち切る感覚Build In:Out 系 title は <title> 自体がアニメーション付き generator。 別途 <filter-video> でエフェクトを乗せる必要はない。 typing は "始まった瞬間から" 自動で走る。
1920x1080 基準 pixel (4K素材でも内部基準は1920x1080)。
帯(画像オーバーレイ)と並べる時は単位差に注意。詳細は fcp-image-overlay の単位変換を参照。
字幕に Drop Shadow や Outline を付ける場合、param key は FCP正規 export からのみ確定する。 推測で 9999/.../4/352 系を書いても効かない(実測あり)。
FCPは clip削除や再import の際に resource ID を再番号付けする。<title ref="r3"> 固定書きは時間差で壊れる。
import re
BASIC_TITLE_EFFECT_RE = re.compile(
r'<effect\s+id="(r\d+)"\s+name="Basic Title"', re.DOTALL
)
def main():
content = INFO_FCPXML.read_text(encoding="utf-8")
m = BASIC_TITLE_EFFECT_RE.search(content)
if not m:
raise SystemExit("Basic Title effect not found")
basic_title_effect_id = m.group(1) # 実行時に取得削除regex も汎用化:
# 良: id汎用、再番号付けに強い
TITLE_BLOCK_RE = re.compile(r'\s*<title\s+ref="r\d+"[^>]*>.*?</title>', re.DOTALL)字幕は文言や位置の試行錯誤が頻発する。FCP上で軽快に refine するためのワークフロー:
9999/999166631/999166633/...、 Typewriter は 9999/10986/10988/...) ので param が無視される999169573/401、 Typewriter は 1156452346/401。 末尾IDが違う<param name="Size"> を併記する (Basic Title)r\d+ で汎用化するxml_escape() を text/name 書き出し直前に必ず適用alignment="0 (Left)" + 中心スタートで右展開する選択肢も持つ<title>)を lane 3–4。lane="1" のような低番号でも import は通るが、後から帯を足すと合成順が崩れやすい。最初から「将来の帯」を見越して余白 lane を空けるか、帯導入時に lane をまとめて見直す。feedback_fcpxml_title_structure.md — title要素の正規構造(実測ベース)feedback_fcpxml_resource_id_dynamic.md — resource ID 動的取得の必要性feedback_fcpxml_typewriter.md — Typewriter title の正規構造と Basic Title との差異~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.