AVIS (AVIF Image Sequence) のマジック検出を追加
marcel に AVIS (AVIF image sequence) のマジック検出が加わり、AVIF アニメーションを正しく MIME タイプとして判別できるようになりました。
背景
AVIF アニメーションが video/quicktime と誤判定されていた問題が Issue #150 で報告されていました。該当 Issue では、AVIF の ftypavis マジックが存在しないために検出できないことが指摘されています。この PR は、既存の検出ロジックに AVIS 用マジックを追加することで問題を根本的に解決することを目的としています。
技術的な変更
lib/marcel/mime_type/definitions.rb に AVIS 用マジック が追加されました。具体的には image/avif の定義に magic: [[4, "ftypavis"]] が新規行として挿入され、拡張子 avif は従来どおり関連付けられています。
@@ -50,6 +50,7 @@
Marcel::MimeType.extend "application/x-x509-ca-cert", magic: [[0, '-----BEGIN CERTIFICATE-----']], extensions: %w( pem ), parents: "application/x-x509-cert;format=pem"
Marcel::MimeType.extend "image/avif", magic: [[4, "ftypavif"]], extensions: %w( avif )
+Marcel::MimeType.extend "image/avif", magic: [[4, "ftypavis"]], extensions: %w( avif )
Marcel::MimeType.extend "image/heif", magic: [[4, "ftypmif1"]], extensions: %w( heif )
Marcel::MimeType.extend "image/heic", magic: [[4, "ftypheic"]], extensions: %w( heic )
テスト用 fixture が test/fixtures/magic/image/avif/avis.avif として追加され、AVIS ファイルの検出ロジックを自動テストで検証できるようになりました。fixture の存在は実際の AVIS バイナリがリポジトリに含まれていることを示し、CI での回帰防止に寄与します。
設計判断
新しいマジックは 既存の image/avif 定義に追加 する形で実装されました。別タイプを作らず同一 MIME タイプに複数のマジックを持たせることで、拡張子 avif の取り扱いを一元化し、既存ユーザーへの互換性を保っています。
マジックの形式は他の AVIF 系定義と同様に オフセット 4 バイト目 にシグネチャ文字列を置くパターン (ftypavif, ftypavis) を踏襲しています。この一貫性により、マジック検出ロジックの変更点は最小限に抑えられ、コードベース全体の可読性と保守性が向上します。
まとめ
AVIS (AVIF Image Sequence) のマジック検出を追加したことで、marcel は AVIF アニメーションを正確に分類できるようになり、Issue #150 で報告された誤判定が解消されました。既存の image/avif 定義を拡張するシンプルな設計選択により、互換性と保守性を損なうことなく新機能を提供しています。