summaryrefslogtreecommitdiff
path: root/packages/backend/src/services/drive/generate-video-thumbnail.ts
blob: ca12ab8d3d6ff040fe5361c32ffa9b770a3bdba8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import * as fs from 'node:fs';
import * as path from 'node:path';
import { createTemp } from '@/misc/create-temp.js';
import { IImage, convertToJpeg } from './image-processor.js';
import FFmpeg from 'fluent-ffmpeg';

export async function GenerateVideoThumbnail(source: string): Promise<IImage> {
	const [file, cleanup] = await createTemp();
	const parsed = path.parse(file);

	try {
		await new Promise((res, rej) => {
			FFmpeg({
				source,
			})
			.on('end', res)
			.on('error', rej)
			.screenshot({
				folder: parsed.dir,
				filename: parsed.base,
				count: 1,
				timestamps: ['5%'],
			});
		});

		// JPEGに変換 (Webpでもいいが、MastodonはWebpをサポートせず表示できなくなる)
		return await convertToJpeg(498, 280);
	} finally {
		cleanup();
	}
}