ビデオ添付ファイルにキャプション編集機能を追加

basecamp/lexxy

ビデオ添付ファイルに対してもキャプション編集用のtextareaが表示されるようになり、画像添付ファイルと同等の操作性が実現されました。これにより、ユーザーはビデオファイルにカスタムキャプションを付与できます。

背景

これまで、ビデオ添付ファイルのキャプション表示は静的なファイル情報(ファイル名とサイズ)のみで構成されており、ユーザーが独自のキャプションを追加する手段がありませんでした。画像添付ファイルでは編集可能なtextareaが用意されていたため、ビデオとの間に機能的な非対称性が生じていました。

この非対称性は createDOM() メソッドのDOM構築ロジックに起因していました。プレビュー可能な画像の場合は #createEditableCaption() が呼ばれ、それ以外のファイルは一律で #createDOMForNotImage() にフォールスルーする分岐しか存在せず、ビデオを個別に扱うパスが用意されていませんでした。

技術的な変更

ActionTextAttachmentNodeisVideo ゲッターを追加し、createDOM() にビデオ専用の分岐を設けることで、ビデオ添付ファイルのDOM構造を制御できるようになりました。

isVideo ゲッターは contentType"video/" で始まるかどうかを判定します:

get isVideo() {
  return this.contentType.startsWith("video/")
}

createDOM() の分岐は以下のように変更されました:

変更前:

if (this.isPreviewableAttachment) {
  figure.appendChild(this.#createDOMForImage())
  figure.appendChild(this.#createEditableCaption())
} else {
  figure.appendChild(this.#createDOMForFile())
  figure.appendChild(this.#createDOMForNotImage())
}

変更後:

if (this.isPreviewableAttachment) {
  figure.appendChild(this.#createDOMForImage())
  figure.appendChild(this.#createEditableCaption())
} else if (this.isVideo) {
  figure.appendChild(this.#createDOMForFile())
  figure.appendChild(this.#createEditableCaption())
} else {
  figure.appendChild(this.#createDOMForFile())
  figure.appendChild(this.#createDOMForNotImage())
}

ビデオの場合、ファイルアイコンは引き続き #createDOMForFile() で生成しつつ、キャプション部分だけ #createEditableCaption() に差し替えています。ビデオファイル自体のプレビュー描画は変更せず、キャプション領域のみを可変にした最小限の変更です。

テストは Playwright を用いたブラウザテストとして追加されました(test/browser/tests/attachments/video_caption.test.js)。video/mp4content-type を持つ action-text-attachment 要素を挿入し、figcaption textarea の存在確認と placeholder 属性の検証、さらにキャプション入力・保存のフローを検証しています。

設計判断

ビデオを「プレビュー可能な画像」とは別のカテゴリとして明示的に分類する設計が採用されました。

isPreviewableAttachment の条件にビデオを含める方法も考えられますが、ビデオのレンダリング自体(#createDOMForImage() vs #createDOMForFile())は画像と異なります。ビデオ用の独立した else if 分岐を設けることで、「ファイルアイコン+編集可能キャプション」という組み合わせをビデオ固有の表現として明確に定義しています。

contentType.startsWith("video/") による判定は、video/mp4video/webmvideo/ogg など、MIMEタイプが video/ で始まる全てのビデオ形式を網羅します。特定の形式を列挙する代わりにプレフィックス判定を用いることで、将来の形式追加に対して設計が開かれています。

まとめ

isVideo ゲッターの追加と createDOM() への1分岐の挿入という最小限の変更で、ビデオ添付ファイルと画像添付ファイルの操作性が統一されました。既存のメソッド群(#createDOMForFile()#createEditableCaption())を再利用しつつ組み合わせを変えるだけで新しい挙動を実現しており、添付ファイルのDOM構築ロジックが組み合わせ可能な形に設計されていることが示されています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
50643294

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)」という理想的な3部構成が明確に守られています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```javascript:src/nodes/action_text_attachment_node.js)とPR番号のリンク記法([PR #950](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

DOM構築ロジックやゲッターなどの技術用語を前提としており、専門知識を持つエンジニアという対象読者に適合しています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論で構成され、各パラグラフがトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が徹底されています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されている`isVideo`ゲッターと`createDOM`メソッドのコードは、提供されたDiff情報と完全に一致しています。テストファイル名も正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`ActionTextAttachmentNode`, `contentType`, `Playwright`など、PRやDiffで使われている技術用語を正確に使用しています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

「`else if (this.isVideo)`の分岐を追加した」という説明や、テスト内容に関する記述は、Diffのコード変更と整合しており、技術的に正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事の主張はすべてPRのDescriptionやDiffのコード変更に基づいています。「設計判断」セクションはPRに明記されていませんが、コードから論理的に導出できる妥当な解説であり、ハルシネーションではありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号である「#950」が正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトル「ビデオ添付ファイルにキャプション編集機能を追加」は、PRタイトル「Enable editable captions for video attachments」の内容を正確に反映しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

バージョン情報やリリース予定など、PR情報に基づかない外部知識の追記はなく、事実に基づいた記述がされています。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「これまで」といった時間表現は、PR Descriptionの「Previously」と一致しており、時間的な文脈を正確に伝えています。