NextCloud の Gallery で使われるサムネイルを一括生成したり自動生成させる

スポンサーリンク

 NextCloud の Gallery アプリにブラウザからアクセスすると、アクセスしたときにサムネイルを生成する。
 アクセス間隔が長かったりで生成すべきサムネイルが多いと表示に時間が掛かかるし CPU リソースなど結構持って行かれてしまう。
 また、一括してサムネイルを生成したい場合もあるもんで便利なアプリは無い物かと探したら見つけた。もとい昔からあったんだけど上手いこと動かなかったので放置していた事でもあった。

アプリの導入。

Preview Generator - Apps - App Store - Nextcloud
The Nextcloud App Store - Upload your apps and install new apps onto your Nextcloud

 上記サイトからアプリをダウンロードして手動インストールでもいいし、NextCloud 上からアプリ追加画面で「Preview Generator」と検索してブラウザ上からインストールして有効化するのも楽で良い。

Preview Generator の使い方

 コマンドライン操作が必要となる。
 筆者環境では /var/www/html/nextcloud 以下に NextCloud をインストールし、実効ユーザーは nginx にやらせているので取り敢えずこれで解説。

 存在するコマンドは 3 つで occ コマンドの引数として与える。これは GitHub にあるページに書いてあることをそのまま書いてみる。

  • preview:delete_old
     NextCloud 11 以前の旧形式なサムネイルを削除してくれる。
     例) sudo -u nginx php /var/www/html/nextcloud/occ preview:delete_old

  • preview:generate-all [user-id]
     全てのファイルのサムネイルを生成する。user-id の指定があった場合はそのユーザーのサムネイルだけ生成する。
     例) sudo -u nginx php /var/www/html/nextcloud/occ preview:generate-all

  • preview:pre-generate
     前回生成以降の新しいファイルや変更されたファイルのサムネイルだけを生成する。
     これは単体実行するというよりも cron で 10 分置きなどの定期実行をさせて使う。

NextCloud への設定追加

 例えば preview:generate-all を実行した場合、様々な画像サイズのサムネイルを生成してしまう。
 すると大きな画像だとファイルサイズを喰うしサムネイル生成時間もかなりかかってしまう。
 その為、予め NextCloud の設定ファイル config.php で最大サイズを小さく指定しておくとサクサク生成してくれるようになる。

'preview_max_x' => 512,
'preview_max_y' => 512, 
'preview_max_scale_factor' => 1,

 上記 3 行を /var/www/html/nextcloud/config/config.php$CONFIG = array ( の中のブロックに追加してあげる。
 するとサムネイルサイズの横方向と縦方向何れかに最大 512 ピクセルまでのサムネイルとし、512 ピクセル以下の画像であっても拡大せず等倍とするようになる。
 参考までに preview_max_x と y のパラメータ未指定時に於けるデフォルト値は null であり上限無し。preview_max_scale_factor は 10 となり最大 10 倍まで拡大される。

 Gallery にアクセスをしてサムネイルをクリックした時にポップアップ表示される画像も実はサムネイルなのでこの設定の影響を受ける
 サムネイル生成時間は犠牲になるけど場合に応じては preview_max_x と preview_max_y を倍の 1024 などとすると画像も程よく見やすくなるだろう。
 色々試した結果筆者は 画像一辺の最大サイズが 1024 になるよう調整したところで落ち着いた。

全サムネイルを再生成したい場合

 既にブラウザから Gallery にアクセスをして生成されているサムネイルを一括して再生成したい場合は次の手順をとる。

DB のテーブルを削除

mysql -u hoge -p
use NEXTCLOUD_DATABASE;
DELETE FROM oc_filecache;
quit

 hoge は NextCloud の DB にアクセス出来るユーザー名を入れ、NEXTCLOUD_DATABASE は NextCloud の DB 名を入れる。
 念のため作業前に DB を dump してバックアップしておくと良いだろう。

サムネイルディレクトリの削除

rm -R /path/to/data/appdata_xxxxxxxx/preview

 NextCloud のデータを保存してるパスを /path/to と表した。data ディレクトリ以下にある appdata_ から始まるディレクトリ内に preview というディレクトリがあるので、これをまるっと削除する。
 一応手打ちで該当ディレクトリが見えるところまで移動してから rm -R ./preview とした方が安心かなと。

サムネイルを全て一括で生成

sudo -u nginx php /var/www/html/nextcloud/occ preview:generate-all

 この様にコマンドを打てば全てのディレクトリを巡回してサムネイルを生成してくれる。
 保存されている画像次第では相当な時間が掛かると思うので放置したまま寝る準備をしておくのも吉。

 サムネイル生成中に Gallery にアクセスして画像をみたりしていた時、サムネイルをクリックしてもエラーで表示出来ない事も何回かあったが、暫くしてリロードするなりしたら回復した。

 生成中はこう言ったエラーが発生する場合もあると考えておくと良いかも。

 2018/10/14 9:30 追記
 筆者環境で全画像ファイルのサムネイル一括生成が完了したので追記。
 生成サイズは preview_max_x と preview_max_y を共に 1024 と調整した。

 生成元の画像ファイルを数える。

find /path/to/data/USERNAME/files -type f -regextype posix-egrep -iregex ".*\.(bmp|jpe?g|png)$" | wc -l

 とコマンドを打ち込んで画像ファイル数を数えたら 5,948 個あった。

 これら画像の全容量は

find /path/to/data/USERNAME/files -type f -regextype posix-egrep -iregex ".*\.(bmp|jpe?g|png)$" | awk '{sum +=$7;} END {printf("%d \n",sum)}'

 としたら約 18.73GB となった。

 一括生成に掛かった時間は 4 時間 18 分となったので 1 ファイルあたりで換算すると 2.6 秒かかり、容量換算 1GB あたり 826 秒かかる事がわかった。CPU は Core i3-550 なので速度は遅いはず。

 生成されたサムネイルの合計サイズは 6.3GB となった。ソースの約 1/3 ほどのサムネイルが作成されるという事に。
 1 つの画像で生成されたサムネイル数は次の様に結構多いなと感じた。Gallery 以外でもファイルブラウザで使われるアイコンも生成しているようだ。

1024-768-max.jpg
128-128-crop.jpg
128-96.jpg
171-128.jpg
256-192.jpg
256-256-crop.jpg
32-24.jpg
32-32-crop.jpg
341-256.jpg
43-32.jpg
512-384.jpg
512-512-crop.jpg
64-48.jpg
64-64-crop.jpg
683-512.jpg
768-768-crop.jpg
85-64.jpg

定期的にサムネイルを生成させる

*/10 * * * * /bin/php /var/www/html/nextcloud/occ preview:pre-generate

 といった感じで cron に登録しておけば 10 分置きに自動で未生成な画像のサムネイルを生成してくれる。
 次回アクセスしたときには既に生成も出来ていると思うのでサクッと表示も終わるハズだ。

おわりに

 これで Gallery にアクセスした時やスクロールを度にサムネイル生成を待つ必要もなくなる。
 またサムネイルサイズの上限設定を加えて全サムネイルを一括削除後に再度一括生成する事でもしかしたらストレージの使用量削減もできるかもしれない。

スポンサーリンク