ついてここで書いてきた。
しかし実はPreview Generatorには欠点もある。cronによるバックグラウンド処理により、アップロードされた新規ファイルを見つけてプレビュー画像を生成するアプリなのであるが、外部ストレージ(External Storage)に保存された新規ファイルのスキャンはできないのである。少し具体的に書くと、
全てのファイルをスキャンする External Storageも処理の対象となる % php ./occ preview:generate-all 新規ファイルのプレビューだけを作成 External Storageは処理の対象とならない % php .occ preview:pre-generate
このように、cronで動かす差分アップデートコマンド(preview:pre-generateが問題となる。これはNextcloud本体に対して3rd partyアプリが使用可能なライブラリの機能の制約から来ているようなのでアプリレイヤでは解決が難しい問題である。
このような理由で外部ストレージのPreview Generatorの利用は諦めてかけていたのだが、私の環境はTrueNASの共有ディレクトリをNextcloudで閲覧する構成で組んでいるので、Nextcloudは外部ストレージをメインのストレージとしているのである。そのため、どうしてもこの問題をなんとか解決したいのである。
この問題は公式のフォーラムやチケットでも取り上げられており、同じ悩みを抱えている人は世界中にいるのに根本的な解決に至っていない。そこで、解決策を作ってみた。
解決方法のロジック
Preview Generatorのキュー管理
$gt; select * from oc_preview_generation; +----+--------+---------+ | id | uid | file_id | +----+--------+---------+ | 10 | uname | 615 | | 11 | uname | 616 | +----+--------+---------+ 2 rows in set (0.00 sec)
gt; show columns from oc_preview_generation; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | uid | varchar(256) | NO | | NULL | | | file_id | int | NO | | NULL | | +---------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
file_idの探し方
> select * from oc_storages; +------------+---------------------------------------+-----------+--------------+ | numeric_id | id | available | last_checked | +------------+---------------------------------------+-----------+--------------+ | 1 | home::ncadmin | 1 | NULL | | 2 | local::/usr/local/www/nextcloud/data/ | 1 | NULL | | 3 | home::uname | 1 | NULL | | 4 | local::/media/z_dev_photos/ | 1 | 1642304007 | +------------+---------------------------------------+-----------+--------------+ 4 rows in set (0.00 sec)
> SELECT MAX(fileid) FROM oc_filecache WHERE storage=4 AND mimetype!=2; +-------------+ | MAX(fileid) | +-------------+ | 68418 | +-------------+ 1 row in set (0.06 sec)
> SELECT fileid, path FROM oc_filecache WHERE storage=4 AND fileid>68415 AND mimetype!=2;
+--------+--------------------------+
| fileid | path |
+--------+--------------------------+
| 68416 | 2007年/004/IMGP4976.JPG |
| 68417 | 2007年/004/IMGP5344.JPG |
| 68418 | 2007年/004/HI3A0006.JPG |
+--------+--------------------------+
3 rows in set (0.01 sec)
> INSERT INTO oc_preview_generation (uid, file_id) VALUES ('uname', 68416); Query OK, 1 row affected (2.66 sec) > select * from oc_preview_generation; +----+--------+---------+ | id | uid | file_id | +----+--------+---------+ | 14 | uname | 68416 | +----+--------+---------+ 1 row in set (0.00 sec)
% php .occ preview:pre-generate
実装 - Preview Generator Helper
手作業でMySQLを操作して、外部ストレージをプレビュー作成のキューに登録することで動作ができることが確認できた。しかし、毎度これを手作業で行うわけにもいかないのでスクリプトで処理をすることにする。
ソースコードはGitHubに置いた。
使い方
まずはスクリプトの冒頭の設定を書く。
# Config. to connect MySQL DB our $DB_NAME = "nextcloud"; our $DB_USER = "dbadmin"; our $DB_PASS = "password"; our $DB_HOST = "localhost"; our $DB_PORT = "3386"; # Nextcloud - to specify a storage to seek our $NC_USER = "nextuser"; # User name who can read the storage our $NC_STORAGE_ID = 7; # Storage ID which is found on oc_storages # To record the last file_id to seek our $LAST_ID_FILE = "/usr/local/www/last_file_id.dat";
0 件のコメント:
コメントを投稿