Nextcloudで動画のサムネイルが生成されない問題を解決

nextcloud

約 6 分で読めます。



Nextcloudで動画をアップロードしたときに、通常は↓のようにサムネイルが作られます。



しかし、自分の環境では作られないことがありました。
↓のように ▷ が出るだけ。

原因と対策

いろいろ調べた結果、以下が原因でした。

①動画生成にはffmpegコマンドを使うが、インストールされていない
②localeがC/POSIXになっているためにPHP関数のescapeshellargが誤動作する



そこで、以下の対応をしました。

①ffmpegをインストールする
②Nextcloudのlocaleをja_JP.UTF-8に設定する



②について少し補足しておくと、
動画のサムネイルを作る関数は./lib/private/Preview/Movie.phpgenerateThumbNail()で、
以下の通りescapeshellarg()を呼んでいます。

private function generateThumbNail($maxX, $maxY, $absPath, $second): ?IImage {
	$tmpPath = \OC::$server->getTempManager()->getTemporaryFile();

  if (self::$avconvBinary) {
    $cmd = self::$avconvBinary . ' -y -ss ' . escapeshellarg($second) .
      ' -i ' . escapeshellarg($absPath) .
      ' -an -f mjpeg -vframes 1 -vsync 1 ' . escapeshellarg($tmpPath) .
      ' > /dev/null 2>&1';
  } else {
    $cmd = self::$ffmpegBinary . ' -y -ss ' . escapeshellarg($second) .
      ' -i ' . escapeshellarg($absPath) .
      ' -f mjpeg -vframes 1' .
      ' ' . escapeshellarg($tmpPath) .
      ' > /dev/null 2>&1';
  }
(略)



escapeshellarg()はlocaleの影響を受けるようで、
日本語などマルチバイト文字がフォルダーに含まれている場合は、
localeを設定してやらないと意図した動作にならないとのこと。

 参考にさせていただいた記事



ffmpegをインストールする

これは難しくありません。

apt install ffmpeg



Nextcloudのlocaleをja_JP.UTF-8に設定する

↓の通り2段階に分けます。

・localeにja_JP.UTF-8を追加
・Nextcloudでsetlocale(LC_CTYPE, 'ja_JP.UTF-8');する

localeにja_JP.UTF-8を追加

こちらの記事を参考にさせていただき、以下のようにDockerfileで指定。

RUN	apt -y install locales && \
	echo "ja_JP UTF-8" > /etc/locale.gen && \
	locale-gen && \
	(略)

↑のあとにphp-fpmを起動させるようにすればOK。

Nextcloudでsetlocale(LC_CTYPE, ‘ja_JP.UTF-8’);する

これは少し考えました。

Nextcloudのソースコードを直接修正したくないので、auto_prepend_fileに入れました。
 Ver.upのたびに面倒を見ないといけなくなる

PHP実行のたびに毎回呼ばれるため、パフォーマンスへの悪影響が気になりますが、
今のところ目立ったもっさり感はないので、いったん様子見で。

まずdocker-compose up -d時に動かすentrypoint.shでphp-fpm実行前に

echo '<?php setlocale(LC_CTYPE, "ja_JP.UTF-8");' > /var/www/prepend.php
chown www-data /var/www/prepend.php

とします。

お次はnginxのserverブロックで

fastcgi_param PHP_VALUE "auto_prepend_file=/var/www/prepend.php";

を指定。

これでsetlocale()が毎回動くようになります。

一応githubのコミット履歴があったので、参考になるかも。

Modified locale from C to ja_JP.UTF-8 to be able to create thumbnail … · kurofuku/nextcloud-container-fpm@4d97971
…of movie by ffmpeg. - Without this locale change creating preview of file which is multibyte folder fails.



これで日本語の含まれたフォルダーに動画を入れてもサムネイルが作られるはず。

終わりに

いかがでしたか。

快適なNextcloudライフを!

この記事を書いた人

組込ソフト歴15年の外資系エンジニア。
前職で組込Linuxを使った商品設計/品質確保の業務に従事。
Raspberry Piが好き。
株式投資で年50万円を稼ぐ。
妻は香港人(国際結婚)。

Please follow me
nextcloud
Please follow me

Comments

タイトルとURLをコピーしました