diff --git a/packages/backend/src/core/FileInfoService.ts b/packages/backend/src/core/FileInfoService.ts index b8babcb3a7..82b731c609 100644 --- a/packages/backend/src/core/FileInfoService.ts +++ b/packages/backend/src/core/FileInfoService.ts @@ -317,6 +317,27 @@ export class FileInfoService { return mime; } + /** + * ビデオファイルにビデオトラックがあるかどうかチェック + * (ない場合:m4a, webmなど) + */ + @bindThis + private hasVideoTrackOnVideoFile(path: string): Promise { + return new Promise((resolve, reject) => { + try { + FFmpeg.ffprobe(path, (err, metadata) => { + if (err) { + resolve(true); + return; + } + resolve(metadata.streams.some((stream) => stream.codec_type === 'video')); + }); + } catch (e) { + resolve(true); + } + }); + } + /** * Detect MIME Type and extension */ @@ -339,6 +360,26 @@ export class FileInfoService { return TYPE_SVG; } + if (type.mime.startsWith('video') && !(await this.hasVideoTrackOnVideoFile(path))) { + const newMime = `audio/${type.mime.split('/')[1]}`; + if (newMime === 'audio/mp4') { + return { + mime: 'audio/aac', + ext: 'm4a', + }; + } + if (newMime === 'audio/webm') { + return { + mime: 'audio/webm', + ext: 'webm', + }; + } + return { + mime: newMime, + ext: type.ext, + }; + } + return { mime: this.fixMime(type.mime), ext: type.ext, diff --git a/packages/backend/test/unit/FileInfoService.ts b/packages/backend/test/unit/FileInfoService.ts index 2eec80d763..a33a6024f4 100644 --- a/packages/backend/test/unit/FileInfoService.ts +++ b/packages/backend/test/unit/FileInfoService.ts @@ -323,8 +323,6 @@ describe('FileInfoService', () => { }); }); - /* - * video/webmとして検出されてしまう test('WEBM AUDIO', async () => { const path = `${resources}/kick_gaba7.webm`; const info = await fileInfoService.getFileInfo(path, { skipSensitiveDetection: true }) as any; @@ -344,6 +342,5 @@ describe('FileInfoService', () => { }, }); }); - */ }); });