summaryrefslogtreecommitdiff
path: root/src/services
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-08-16 06:27:35 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-08-16 06:27:35 +0900
commit1c7a1949501973014dfa6efa79a9d33d1a292a7e (patch)
tree61ebde7b60dc21591c5323d4130b22b1dda9ba47 /src/services
parentfix(package): update @types/node to version 10.7.1 (diff)
downloadsharkey-1c7a1949501973014dfa6efa79a9d33d1a292a7e.tar.gz
sharkey-1c7a1949501973014dfa6efa79a9d33d1a292a7e.tar.bz2
sharkey-1c7a1949501973014dfa6efa79a9d33d1a292a7e.zip
wip
Diffstat (limited to 'src/services')
-rw-r--r--src/services/drive/add-file.ts61
1 files changed, 54 insertions, 7 deletions
diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts
index 701d547776..277d628ac9 100644
--- a/src/services/drive/add-file.ts
+++ b/src/services/drive/add-file.ts
@@ -17,30 +17,52 @@ import { publishUserStream, publishDriveStream } from '../../stream';
import { isLocalUser, IUser, IRemoteUser } from '../../models/user';
import delFile from './delete-file';
import config from '../../config';
+import { getDriveFileThumbnailBucket } from '../../models/drive-file-thumbnail';
const log = debug('misskey:drive:add-file');
-async function save(readable: stream.Readable, name: string, type: string, hash: string, size: number, metadata: any): Promise<IDriveFile> {
+async function save(path: string, name: string, type: string, hash: string, size: number, metadata: any): Promise<IDriveFile> {
+ let thumbnail: Buffer;
+
+ if (['image/jpeg', 'image/png', 'image/webp'].includes(type)) {
+ thumbnail = await sharp(path)
+ .resize(500)
+ .jpeg({
+ quality: 70,
+ progressive: true
+ })
+ .toBuffer();
+ }
+
if (config.drive && config.drive.storage == 'minio') {
const minio = new Minio.Client(config.drive.config);
const id = uuid.v4();
const obj = `${config.drive.prefix}/${id}`;
+ const thumbnailObj = `${obj}-thumbnail`;
const baseUrl = config.drive.baseUrl
|| `${ config.drive.config.secure ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? ':' + config.drive.config.port : '' }/${ config.drive.bucket }`;
- await minio.putObject(config.drive.bucket, obj, readable, size, {
+ await minio.putObject(config.drive.bucket, obj, fs.createReadStream(path), size, {
'Content-Type': type,
'Cache-Control': 'max-age=31536000, immutable'
});
+ if (thumbnail) {
+ await minio.putObject(config.drive.bucket, thumbnailObj, fs.createReadStream(path), size, {
+ 'Content-Type': 'image/jpeg',
+ 'Cache-Control': 'max-age=31536000, immutable'
+ });
+ }
+
Object.assign(metadata, {
withoutChunks: true,
storage: 'minio',
storageProps: {
id: id
},
- url: `${ baseUrl }/${ obj }`
+ url: `${ baseUrl }/${ obj }`,
+ thumbnailUrl: thumbnail ? `${ baseUrl }/${ thumbnailObj }` : null
});
const file = await DriveFile.insert({
@@ -57,12 +79,37 @@ async function save(readable: stream.Readable, name: string, type: string, hash:
// Get MongoDB GridFS bucket
const bucket = await getDriveFileBucket();
- return new Promise<IDriveFile>((resolve, reject) => {
- const writeStream = bucket.openUploadStream(name, { contentType: type, metadata });
+ const file = await new Promise<IDriveFile>((resolve, reject) => {
+ const writeStream = bucket.openUploadStream(name, {
+ contentType: type,
+ metadata
+ });
+
writeStream.once('finish', resolve);
writeStream.on('error', reject);
- readable.pipe(writeStream);
+
+ fs.createReadStream(path).pipe(writeStream);
});
+
+ if (thumbnail) {
+ const thumbnailBucket = await getDriveFileThumbnailBucket();
+
+ await new Promise<IDriveFile>((resolve, reject) => {
+ const writeStream = thumbnailBucket.openUploadStream(name, {
+ contentType: 'image/jpeg',
+ metadata: {
+ originalId: file._id
+ }
+ });
+
+ writeStream.once('finish', resolve);
+ writeStream.on('error', reject);
+
+ fs.createReadStream(path).pipe(writeStream);
+ });
+ }
+
+ return file;
}
}
@@ -321,7 +368,7 @@ export default async function(
}
}
} else {
- driveFile = await (save(fs.createReadStream(path), detectedName, mime, hash, size, metadata));
+ driveFile = await (save(path, detectedName, mime, hash, size, metadata));
}
log(`drive file has been created ${driveFile._id}`);