diff options
| author | かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> | 2024-03-31 12:43:39 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-31 12:43:39 +0900 |
| commit | efafa02f6820a31df5dded620cf0f6ef30454e0c (patch) | |
| tree | e418c59d14c97dbcfcb04b6421cdcfe47cd968a7 /packages/backend/src/core/FileInfoService.ts | |
| parent | fix(frontend): remove duplicate CSS declaration (#13640) (diff) | |
| download | sharkey-efafa02f6820a31df5dded620cf0f6ef30454e0c.tar.gz sharkey-efafa02f6820a31df5dded620cf0f6ef30454e0c.tar.bz2 sharkey-efafa02f6820a31df5dded620cf0f6ef30454e0c.zip | |
enhance(backend): ビデオファイルにビデオトラックがあるかを確認するように (#13568)
* enhance(backend): ビデオファイルにビデオトラックがあるかを確認するように
(cherry picked from commit 23d38a2d6492a2b24e9b2c031d66c3e8a5d382ef)
* Update Changelog
* Update Changelog
* Revert "Update Changelog"
This reverts commit 93fd996932b87ef550c38b48bd0678060f3ed1af.
* fix(test) ffmpegをインストールするように
* 入れる方間違えた
* fix test
* 拡張子変わらなかったのでそのまま行く
* ログを出力するように
* msg
* remove unused import
* add log
* attempt to fix test error
* Revert "attempt to fix test error"
This reverts commit d9d6524cadd655e6d8e9398b26fdfef332f30f4d.
* Update FileInfoService.ts
* oggも検査の対象にする
Diffstat (limited to 'packages/backend/src/core/FileInfoService.ts')
| -rw-r--r-- | packages/backend/src/core/FileInfoService.ts | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/packages/backend/src/core/FileInfoService.ts b/packages/backend/src/core/FileInfoService.ts index b8babcb3a7..169285f033 100644 --- a/packages/backend/src/core/FileInfoService.ts +++ b/packages/backend/src/core/FileInfoService.ts @@ -14,11 +14,12 @@ import FFmpeg from 'fluent-ffmpeg'; import isSvg from 'is-svg'; import probeImageSize from 'probe-image-size'; import { type predictionType } from 'nsfwjs'; -import sharp from 'sharp'; import { sharpBmp } from '@misskey-dev/sharp-read-bmp'; import { encode } from 'blurhash'; import { createTempDir } from '@/misc/create-temp.js'; import { AiService } from '@/core/AiService.js'; +import { LoggerService } from '@/core/LoggerService.js'; +import type Logger from '@/logger.js'; import { bindThis } from '@/decorators.js'; export type FileInfo = { @@ -49,9 +50,13 @@ const TYPE_SVG = { @Injectable() export class FileInfoService { + private logger: Logger; + constructor( private aiService: AiService, + private loggerService: LoggerService, ) { + this.logger = this.loggerService.getLogger('file-info'); } /** @@ -318,6 +323,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 @@ -339,6 +372,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, |