From 15e4cf1243001873edd1860ee61bc96d003214ee Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 3 May 2018 20:03:14 +0900 Subject: サムネイルを予め生成するように MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/drive/add-file.ts | 49 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) (limited to 'src/services/drive') diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 279cdf0bc7..e7f3572c74 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -10,12 +10,14 @@ import * as debug from 'debug'; import fileType = require('file-type'); import prominence = require('prominence'); -import DriveFile, { IMetadata, getGridFSBucket, IDriveFile, DriveFileChunk } from '../../models/drive-file'; +import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile, DriveFileChunk } from '../../models/drive-file'; import DriveFolder from '../../models/drive-folder'; import { pack } from '../../models/drive-file'; import event, { publishDriveStream } from '../../publishers/stream'; import getAcct from '../../acct/render'; import { IUser, isLocalUser } from '../../models/user'; +import DriveFileThumbnail, { getDriveFileThumbnailBucket, DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail'; +import genThumbnail from '../../drive/gen-thumbnail'; const gm = _gm.subClass({ imageMagick: true @@ -30,8 +32,8 @@ const tmpFile = (): Promise<[string, any]> => new Promise((resolve, reject) => { }); }); -const addToGridFS = (name: string, readable: stream.Readable, type: string, metadata: any): Promise => - getGridFSBucket() +const writeChunks = (name: string, readable: stream.Readable, type: string, metadata: any) => + getDriveFileBucket() .then(bucket => new Promise((resolve, reject) => { const writeStream = bucket.openUploadStream(name, { contentType: type, metadata }); writeStream.once('finish', resolve); @@ -39,6 +41,20 @@ const addToGridFS = (name: string, readable: stream.Readable, type: string, meta readable.pipe(writeStream); })); +const writeThumbnailChunks = (name: string, readable: stream.Readable, originalId) => + getDriveFileThumbnailBucket() + .then(bucket => new Promise((resolve, reject) => { + const writeStream = bucket.openUploadStream(name, { + contentType: 'image/jpeg', + metadata: { + originalId + } + }); + writeStream.once('finish', resolve); + writeStream.on('error', reject); + readable.pipe(writeStream); + })); + const addFile = async ( user: IUser, path: string, @@ -232,6 +248,20 @@ const addFile = async ( 'metadata.deletedAt': new Date() } }); + + //#region サムネイルもあれば削除 + const thumbnail = await DriveFileThumbnail.findOne({ + 'metadata.originalId': oldFile._id + }); + + if (thumbnail) { + DriveFileThumbnailChunk.remove({ + files_id: thumbnail._id + }); + + DriveFileThumbnail.remove({ _id: thumbnail._id }); + } + //#endregion } //#endregion } @@ -263,7 +293,18 @@ const addFile = async ( metadata.uri = uri; } - return addToGridFS(detectedName, readable, mime, metadata); + const file = await (writeChunks(detectedName, readable, mime, metadata) as Promise); + + try { + const thumb = await genThumbnail(file); + if (thumb) { + await writeThumbnailChunks(detectedName, thumb, file._id); + } + } catch (e) { + // noop + } + + return file; }; /** -- cgit v1.3.1-freya