diff options
Diffstat (limited to 'src/services')
| -rw-r--r-- | src/services/drive/add-file.ts | 32 | ||||
| -rw-r--r-- | src/services/drive/upload-from-url.ts | 63 |
2 files changed, 6 insertions, 89 deletions
diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 5be71bc0a2..cdbcb34de4 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -6,7 +6,6 @@ import * as crypto from 'crypto'; import * as Minio from 'minio'; import * as uuid from 'uuid'; import * as sharp from 'sharp'; -import fileType from 'file-type'; import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file'; import DriveFolder from '../../models/drive-folder'; @@ -25,8 +24,8 @@ import { GenerateVideoThumbnail } from './generate-video-thumbnail'; import { driveLogger } from './logger'; import { IImage, ConvertToJpeg, ConvertToWebp, ConvertToPng } from './image-processor'; import Instance from '../../models/instance'; -import checkSvg from '../../misc/check-svg'; import { contentDisposition } from '../../misc/content-disposition'; +import { detectMine } from '../../misc/detect-mine'; const logger = driveLogger.createSubLogger('register', 'yellow'); @@ -306,33 +305,6 @@ export default async function( }); }); - // Detect content type - const detectMime = new Promise<[string, string]>((res, rej) => { - const readable = fs.createReadStream(path); - readable - .on('error', rej) - .once('data', (buffer: Buffer) => { - readable.destroy(); - const type = fileType(buffer); - if (type) { - if (type.mime == 'application/xml' && checkSvg(path)) { - res(['image/svg+xml', 'svg']); - } else { - res([type.mime, type.ext]); - } - } else if (checkSvg(path)) { - res(['image/svg+xml', 'svg']); - } else { - // 種類が同定できなかったら application/octet-stream にする - res(['application/octet-stream', null]); - } - }) - .on('end', () => { - // maybe 0 bytes - res(['application/octet-stream', null]); - }); - }); - // Get file size const getFileSize = new Promise<number>((res, rej) => { fs.stat(path, (err, stats) => { @@ -341,7 +313,7 @@ export default async function( }); }); - const [hash, [mime, ext], size] = await Promise.all([calcHash, detectMime, getFileSize]); + const [hash, [mime, ext], size] = await Promise.all([calcHash, detectMine(path), getFileSize]); logger.info(`hash: ${hash}, mime: ${mime}, ext: ${ext}, size: ${size}`); diff --git a/src/services/drive/upload-from-url.ts b/src/services/drive/upload-from-url.ts index 89efe8a50e..cdf6ba0cef 100644 --- a/src/services/drive/upload-from-url.ts +++ b/src/services/drive/upload-from-url.ts @@ -1,15 +1,12 @@ -import * as fs from 'fs'; import * as URL from 'url'; -import * as tmp from 'tmp'; -import * as request from 'request'; import { IDriveFile, validateFileName } from '../../models/drive-file'; import create from './add-file'; -import config from '../../config'; import { IUser } from '../../models/user'; import * as mongodb from 'mongodb'; import { driveLogger } from './logger'; -import chalk from 'chalk'; +import { createTemp } from '../../misc/create-temp'; +import { downloadUrl } from '../../misc/donwload-url'; const logger = driveLogger.createSubLogger('downloader'); @@ -28,62 +25,10 @@ export default async ( } // Create temp file - const [path, cleanup] = await new Promise<[string, any]>((res, rej) => { - tmp.file((e, path, fd, cleanup) => { - if (e) return rej(e); - res([path, cleanup]); - }); - }); + const [path, cleanup] = await createTemp(); // write content at URL to temp file - await new Promise((res, rej) => { - logger.info(`Downloading ${chalk.cyan(url)} ...`); - - const writable = fs.createWriteStream(path); - - writable.on('finish', () => { - logger.succ(`Download finished: ${chalk.cyan(url)}`); - res(); - }); - - writable.on('error', error => { - logger.error(`Download failed: ${chalk.cyan(url)}: ${error}`, { - url: url, - e: error - }); - rej(error); - }); - - const requestUrl = URL.parse(url).pathname.match(/[^\u0021-\u00ff]/) ? encodeURI(url) : url; - - const req = request({ - url: requestUrl, - proxy: config.proxy, - timeout: 10 * 1000, - headers: { - 'User-Agent': config.userAgent - } - }); - - req.pipe(writable); - - req.on('response', response => { - if (response.statusCode !== 200) { - logger.error(`Got ${response.statusCode} (${url})`); - writable.close(); - rej(response.statusCode); - } - }); - - req.on('error', error => { - logger.error(`Failed to start download: ${chalk.cyan(url)}: ${error}`, { - url: url, - e: error - }); - writable.close(); - rej(error); - }); - }); + await downloadUrl(url, path); let driveFile: IDriveFile; let error; |