Fessのサムネイル生成スクリプトのリファクタリング

Fessのサムネイル生成スクリプト(generate-thumbnail)をリファクタリングしました。主な変更点は以下の通りです。

ImageMagick v7対応

ImageMagick v7ではconvertコマンドがmagickコマンドに変わりました。今回の修正で、v7のmagickコマンドを優先的に使用し、存在しない場合はv6のconvertコマンドにフォールバックするようにしました。

get_imagemagick_cmd() {
  if command -v magick >/dev/null 2>&1; then
    echo "magick"
  elif command -v convert >/dev/null 2>&1; then
    echo "convert"
  else
    echo ""
  fi
}

SVGサムネイル生成

SVGファイルのサムネイル生成に対応しました。rsvg-convertコマンドを使用してSVGをPNGに変換します。

elif [[ x"${cmd_type}" = "xsvg" ]] ; then
  check_command rsvg-convert
  target_file=$(echo "$url" | sed -e "s#^file:/*#/#g")
  rsvg-convert -w 100 -h 100 --keep-aspect-ratio "${target_file}" -o "${output_file}"

MIMEタイプによるフォーマット検出

画像ファイルのサムネイル生成時にMIMEタイプを渡せるようにしました。ImageMagickはファイル拡張子からフォーマットを判定することがありますが、一時ファイルには適切な拡張子がない場合があります。MIMEタイプからフォーマットヒントを生成してImageMagickに渡すことで、より確実にフォーマットを識別できるようになりました。

format_hint=""
case "${mimetype}" in
  "image/gif")  format_hint="gif:" ;;
  "image/tiff") format_hint="tiff:" ;;
  "image/png")  format_hint="png:" ;;
  "image/jpeg") format_hint="jpeg:" ;;
  "image/bmp"|"image/x-windows-bmp"|"image/x-ms-bmp") format_hint="bmp:" ;;
  "image/vnd.adobe.photoshop"|"image/photoshop"|"application/x-photoshop"|"application/photoshop") format_hint="psd:" ;;
esac
${im_cmd} -thumbnail ${image_size} "${format_hint}${target_file}" "${output_file}"

Java側でも、MIMEタイプに基づいて適切な拡張子を持つ一時ファイルを作成するようにしました。

protected String getExtensionFromMimeType(final String mimeType) {
    if (mimeType == null) {
        return "";
    }
    return switch (mimeType) {
    case "image/gif" -> ".gif";
    case "image/tiff" -> ".tiff";
    case "image/svg+xml" -> ".svg";
    case "image/jpeg" -> ".jpg";
    case "image/png" -> ".png";
    case "image/bmp", "image/x-windows-bmp", "image/x-ms-bmp" -> ".bmp";
    case "image/vnd.adobe.photoshop", "image/photoshop", "application/x-photoshop", "application/photoshop" -> ".psd";
    default -> "";
    };
}

macOS互換性

rootユーザーのHOMEディレクトリチェックにmacOS対応を追加しました。Linuxでは/rootですが、macOSでは/var/rootになるため、両方をチェックするようにしています。

if [[ x"$HOME" = "x/root" ]] || [[ x"$HOME" = "x/var/root" ]] ; then
  HOME=/var/lib/fess
fi

これらの変更はFess 15.4.0に含まれる予定です。

Fessのストレージ画面でS3/GCS対応

Fessでは、以前からMinIOクライアントライブラリを使ったストレージ機能をサポートしてきました。しかし、MinIOライブラリがメンテナンスモードになったため、Fess 15.4ではFessの内部ライブラリとしての利用をやめ、AWS SDK for S3とGoogle Cloud Storageライブラリに置き換えました。

これにより、管理画面のストレージ画面でもAmazon S3やGoogle Cloud Storage (GCS) を直接指定して利用できるようになりました。

変更内容

今回の変更では、以下の対応を行いました。

  • MinIOクライアントライブラリを削除し、AWS SDK for S3とGoogle Cloud Storageライブラリを導入
  • StorageClientインターフェースによるストレージ抽象化レイヤーの導入
  • S3StorageClientGcsStorageClientの実装追加
  • StorageClientFactoryによるストレージタイプの自動検出
  • 管理画面のストレージ設定でS3とGCSを選択可能に

ストレージタイプの自動検出

StorageClientFactoryは、設定されたエンドポイントURLからストレージタイプを自動的に判別します。

  • storage.googleapis.comを含む場合はGCSクライアントを使用
  • amazonaws.comを含む場合はS3クライアントを使用
  • その他の場合(MinIOなど)はS3互換クライアントを使用

また、storage.type設定で明示的にストレージタイプ(s3gcsauto)を指定することもできます。

新しい設定項目

管理画面の一般設定に、以下のストレージ設定が追加されました。

設定項目説明
Storage Typeストレージタイプ(s3, gcs, auto)
Storage RegionS3のリージョン(例:us-east-1)
Storage Project IDGCSのプロジェクトID
Storage Credentials PathGCSの認証情報JSONファイルパス

対応プロトコル

クローラーが対応するファイルプロトコルにもs3gcsが追加され、storage://に加えて、s3://gcs://でのクロールも可能になります。

詳細

詳細はPR #2983を参照してください。

FessでS3/GCSの対応

次にリリースされるFess 15.4で、Amazon S3とGoogle Cloud Storage(GCS)のファイルクロールに対応する予定です。

これまでFessでは、file、smb、ftp、storageなどのプロトコルでファイルをクロールできましたが、クラウドストレージに対応してほしいという要望があったので、S3とGCSのサポートを追加しました。

設定としては、crawler.file.protocolss3gcsが追加されるので、ファイルシステムクロールの設定でs3://bucket/pathgcs://bucket/pathといったURLを指定することで、クラウドストレージ上のファイルをクロールできるようになります。

クロール処理の内部では、これらのURLをファイルパスとして認識して、適切に処理するようにProtocolHelperに対応を追加しています。詳細はPR #2982を参照してください。

Fess 15.4がリリースされたら、ぜひ試してみてください。