約 6 分で読めます。
Nextcloudで動画をアップロードしたときに、通常は↓のようにサムネイルが作られます。
しかし、自分の環境では作られないことがありました。
↓のように ▷ が出るだけ。
原因と対策
いろいろ調べた結果、以下が原因でした。
①動画生成にはffmpegコマンドを使うが、インストールされていない ②localeがC/POSIXになっているためにPHP関数のescapeshellargが誤動作する
そこで、以下の対応をしました。
①ffmpegをインストールする ②Nextcloudのlocaleをja_JP.UTF-8に設定する
②について少し補足しておくと、
動画のサムネイルを作る関数は./lib/private/Preview/Movie.phpのgenerateThumbNail()で、
以下の通り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のコミット履歴があったので、参考になるかも。
これで日本語の含まれたフォルダーに動画を入れてもサムネイルが作られるはず。
終わりに
いかがでしたか。
快適なNextcloudライフを!
Comments