diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2018-05-03 20:03:14 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2018-05-03 20:03:14 +0900 |
| commit | 15e4cf1243001873edd1860ee61bc96d003214ee (patch) | |
| tree | 697c9880c8d131b06382957e92672d654d883528 /src/server/file/send-drive-file.ts | |
| parent | oops (diff) | |
| download | misskey-15e4cf1243001873edd1860ee61bc96d003214ee.tar.gz misskey-15e4cf1243001873edd1860ee61bc96d003214ee.tar.bz2 misskey-15e4cf1243001873edd1860ee61bc96d003214ee.zip | |
サムネイルを予め生成するように
Diffstat (limited to 'src/server/file/send-drive-file.ts')
| -rw-r--r-- | src/server/file/send-drive-file.ts | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/src/server/file/send-drive-file.ts b/src/server/file/send-drive-file.ts index ef458265a8..8719ddf70c 100644 --- a/src/server/file/send-drive-file.ts +++ b/src/server/file/send-drive-file.ts @@ -1,8 +1,15 @@ +import * as fs from 'fs'; + import * as Koa from 'koa'; import * as send from 'koa-send'; import * as mongodb from 'mongodb'; -import DriveFile, { getGridFSBucket } from '../../models/drive-file'; -import pour from './pour'; +import DriveFile, { getDriveFileBucket } from '../../models/drive-file'; +import DriveFileThumbnail, { getDriveFileThumbnailBucket } from '../../models/drive-file-thumbnail'; + +const commonReadableHandlerGenerator = (ctx: Koa.Context) => (e: Error): void => { + console.error(e); + ctx.status = 500; +}; export default async function(ctx: Koa.Context) { // Validate id @@ -28,9 +35,33 @@ export default async function(ctx: Koa.Context) { return; } - const bucket = await getGridFSBucket(); + if ('thumbnail' in ctx.query) { + // 動画か画像以外 + if (!/^image\/.*$/.test(file.contentType) && !/^video\/.*$/.test(file.contentType)) { + const readable = fs.createReadStream(`${__dirname}/assets/thumbnail-not-available.png`); + ctx.set('Content-Type', 'image/png'); + ctx.body = readable; + } else { + const thumb = await DriveFileThumbnail.findOne({ 'metadata.originalId': fileId }); + if (thumb != null) { + ctx.set('Content-Type', 'image/jpeg'); + const bucket = await getDriveFileThumbnailBucket(); + ctx.body = bucket.openDownloadStream(thumb._id); + } else { + ctx.set('Content-Type', file.contentType); + const bucket = await getDriveFileBucket(); + ctx.body = bucket.openDownloadStream(fileId); + } + } + } else { + if ('download' in ctx.query) { + ctx.set('Content-Disposition', 'attachment'); + } - const readable = bucket.openDownloadStream(fileId); - - pour(readable, file.contentType, ctx); + const bucket = await getDriveFileBucket(); + const readable = bucket.openDownloadStream(fileId); + readable.on('error', commonReadableHandlerGenerator(ctx)); + ctx.set('Content-Type', file.contentType); + ctx.body = readable; + } } |