summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/FileInfoService.ts
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2024-04-11 13:39:55 +0100
committerdakkar <dakkar@thenautilus.net>2024-04-11 13:39:55 +0100
commita3b4ca782a5dbb51a796eb519e543e2f4ca335d8 (patch)
tree4bc90a66e5feb51cbae4dd1f8c89cccf2290465f /packages/backend/src/core/FileInfoService.ts
parentMerge branch 'develop' into future-2024-03-23-post (diff)
parentenhance(frontend): add link of 2fa guide (diff)
downloadsharkey-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.ts50
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,