diff options
| author | dakkar <dakkar@thenautilus.net> | 2024-04-11 13:39:55 +0100 |
|---|---|---|
| committer | dakkar <dakkar@thenautilus.net> | 2024-04-11 13:39:55 +0100 |
| commit | a3b4ca782a5dbb51a796eb519e543e2f4ca335d8 (patch) | |
| tree | 4bc90a66e5feb51cbae4dd1f8c89cccf2290465f /packages/backend/src/core/FileInfoService.ts | |
| parent | Merge branch 'develop' into future-2024-03-23-post (diff) | |
| parent | enhance(frontend): add link of 2fa guide (diff) | |
| download | sharkey-a3b4ca782a5dbb51a796eb519e543e2f4ca335d8.tar.gz sharkey-a3b4ca782a5dbb51a796eb519e543e2f4ca335d8.tar.bz2 sharkey-a3b4ca782a5dbb51a796eb519e543e2f4ca335d8.zip | |
Merge remote-tracking branch 'misskey/develop' into future-2024-04-10
Diffstat (limited to 'packages/backend/src/core/FileInfoService.ts')
| -rw-r--r-- | packages/backend/src/core/FileInfoService.ts | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/packages/backend/src/core/FileInfoService.ts b/packages/backend/src/core/FileInfoService.ts index 2d3312f247..9a9eae3cae 100644 --- a/packages/backend/src/core/FileInfoService.ts +++ b/packages/backend/src/core/FileInfoService.ts @@ -8,11 +8,13 @@ import * as crypto from 'node:crypto'; import * as stream from 'node:stream/promises'; import { Injectable } from '@nestjs/common'; import * as fileType from 'file-type'; +import FFmpeg from 'fluent-ffmpeg'; import isSvg from 'is-svg'; import probeImageSize from 'probe-image-size'; -import sharp from 'sharp'; import { sharpBmp } from '@misskey-dev/sharp-read-bmp'; import { encode } from 'blurhash'; +import { LoggerService } from '@/core/LoggerService.js'; +import type Logger from '@/logger.js'; import { bindThis } from '@/decorators.js'; export type FileInfo = { @@ -43,8 +45,12 @@ const TYPE_SVG = { @Injectable() export class FileInfoService { + private logger: Logger; + constructor( + private loggerService: LoggerService, ) { + this.logger = this.loggerService.getLogger('file-info'); } /** @@ -148,6 +154,34 @@ export class FileInfoService { } /** + * ビデオファイルにビデオトラックがあるかどうかチェック + * (ない場合:m4a, webmなど) + * + * @param path ファイルパス + * @returns ビデオトラックがあるかどうか(エラー発生時は常に`true`を返す) + */ + @bindThis + private hasVideoTrackOnVideoFile(path: string): Promise<boolean> { + const sublogger = this.logger.createSubLogger('ffprobe'); + sublogger.info(`Checking the video file. File path: ${path}`); + return new Promise((resolve) => { + try { + FFmpeg.ffprobe(path, (err, metadata) => { + if (err) { + sublogger.warn(`Could not check the video file. Returns true. File path: ${path}`, err); + resolve(true); + return; + } + resolve(metadata.streams.some((stream) => stream.codec_type === 'video')); + }); + } catch (err) { + sublogger.warn(`Could not check the video file. Returns true. File path: ${path}`, err as Error); + resolve(true); + } + }); + } + + /** * Detect MIME Type and extension */ @bindThis @@ -169,6 +203,20 @@ export class FileInfoService { return TYPE_SVG; } + if ((type.mime.startsWith('video') || type.mime === 'application/ogg') && !(await this.hasVideoTrackOnVideoFile(path))) { + const newMime = `audio/${type.mime.split('/')[1]}`; + if (newMime === 'audio/mp4') { + return { + mime: 'audio/mp4', + ext: 'm4a', + }; + } + return { + mime: newMime, + ext: type.ext, + }; + } + return { mime: this.fixMime(type.mime), ext: type.ext, |