fix rest of the stuff
This commit is contained in:
parent
dc3c0aaa6d
commit
6c384edba8
|
@ -4,9 +4,10 @@ import {
|
|||
OUTPUT_PATH_PLACEHOLDER,
|
||||
} from 'constants/ffmpeg';
|
||||
import { ElectronFile } from 'types/upload';
|
||||
import { parseFFmpegExtractedMetadata } from 'utils/ffmpeg';
|
||||
import ffmpegFactory from './ffmpegFactory';
|
||||
|
||||
export async function generateThumbnail(
|
||||
export async function generateVideoThumbnail(
|
||||
file: File | ElectronFile
|
||||
): Promise<File | ElectronFile> {
|
||||
let seekTime = 1.0;
|
||||
|
@ -36,52 +37,45 @@ export async function generateThumbnail(
|
|||
throw Error('Thumbnail generation failed');
|
||||
}
|
||||
|
||||
// async extractVideoMetadata(file: File) {
|
||||
// await this.ready;
|
||||
// // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
// const [_, ext] = splitFilenameAndExtension(file.name);
|
||||
// const inputFileName = `${Date.now().toString()}-input.${ext}`;
|
||||
// const outFileName = `${Date.now().toString()}-metadata.txt`;
|
||||
// this.ffmpeg.FS(
|
||||
// 'writeFile',
|
||||
// inputFileName,
|
||||
// await getUint8ArrayView(file)
|
||||
// );
|
||||
// let metadata = null;
|
||||
export async function extractVideoMetadata(file: File | ElectronFile) {
|
||||
const ffmpegClient = await ffmpegFactory.getFFmpegClient();
|
||||
// https://stackoverflow.com/questions/9464617/retrieving-and-saving-media-metadata-using-ffmpeg
|
||||
// -c [short for codex] copy[(stream_specifier)[ffmpeg.org/ffmpeg.html#Stream-specifiers]] => copies all the stream without re-encoding
|
||||
// -map_metadata [http://ffmpeg.org/ffmpeg.html#Advanced-options search for map_metadata] => copies all stream metadata to the out
|
||||
// -f ffmetadata [https://ffmpeg.org/ffmpeg-formats.html#Metadata-1] => dump metadata from media files into a simple UTF-8-encoded INI-like text file
|
||||
const metadata = await ffmpegClient.run(
|
||||
[
|
||||
FFMPEG_PLACEHOLDER,
|
||||
'-i',
|
||||
INPUT_PATH_PLACEHOLDER,
|
||||
'-c',
|
||||
'copy',
|
||||
'-map_metadata',
|
||||
'0',
|
||||
'-f',
|
||||
'ffmetadata',
|
||||
OUTPUT_PATH_PLACEHOLDER,
|
||||
],
|
||||
file,
|
||||
`metadata.txt`
|
||||
);
|
||||
return parseFFmpegExtractedMetadata(
|
||||
new Uint8Array(await metadata.arrayBuffer())
|
||||
);
|
||||
}
|
||||
|
||||
// // https://stackoverflow.com/questions/9464617/retrieving-and-saving-media-metadata-using-ffmpeg
|
||||
// // -c [short for codex] copy[(stream_specifier)[ffmpeg.org/ffmpeg.html#Stream-specifiers]] => copies all the stream without re-encoding
|
||||
// // -map_metadata [http://ffmpeg.org/ffmpeg.html#Advanced-options search for map_metadata] => copies all stream metadata to the out
|
||||
// // -f ffmetadata [https://ffmpeg.org/ffmpeg-formats.html#Metadata-1] => dump metadata from media files into a simple UTF-8-encoded INI-like text file
|
||||
// await this.ffmpeg.run(
|
||||
// '-i',
|
||||
// inputFileName,
|
||||
// '-c',
|
||||
// 'copy',
|
||||
// '-map_metadata',
|
||||
// '0',
|
||||
// '-f',
|
||||
// 'ffmetadata',
|
||||
// outFileName
|
||||
// );
|
||||
// metadata = this.ffmpeg.FS('readFile', outFileName);
|
||||
// this.ffmpeg.FS('unlink', outFileName);
|
||||
// this.ffmpeg.FS('unlink', inputFileName);
|
||||
// return parseFFmpegExtractedMetadata(metadata);
|
||||
// }
|
||||
|
||||
// async convertToMP4(file: Uint8Array, inputFileName: string) {
|
||||
// await this.ready;
|
||||
// this.ffmpeg.FS('writeFile', inputFileName, file);
|
||||
// await this.ffmpeg.run(
|
||||
// '-i',
|
||||
// inputFileName,
|
||||
// '-preset',
|
||||
// 'ultrafast',
|
||||
// 'output.mp4'
|
||||
// );
|
||||
// const convertedFile = this.ffmpeg.FS('readFile', 'output.mp4');
|
||||
// this.ffmpeg.FS('unlink', inputFileName);
|
||||
// this.ffmpeg.FS('unlink', 'output.mp4');
|
||||
// return convertedFile;
|
||||
// }
|
||||
export async function convertToMP4(file: File | ElectronFile) {
|
||||
const ffmpegClient = await ffmpegFactory.getFFmpegClient();
|
||||
return await ffmpegClient.run(
|
||||
[
|
||||
FFMPEG_PLACEHOLDER,
|
||||
'-i',
|
||||
INPUT_PATH_PLACEHOLDER,
|
||||
'-preset',
|
||||
'ultrafast',
|
||||
OUTPUT_PATH_PLACEHOLDER,
|
||||
],
|
||||
file,
|
||||
'output.mp4'
|
||||
);
|
||||
}
|
||||
|
|
|
@ -44,9 +44,8 @@ export async function generateThumbnail(
|
|||
)}`
|
||||
);
|
||||
|
||||
const thumbFile = await FFmpegService.generateThumbnail(
|
||||
file
|
||||
);
|
||||
const thumbFile =
|
||||
await FFmpegService.generateVideoThumbnail(file);
|
||||
addLogLine(
|
||||
`ffmpeg thumbnail successfully generated ${getFileNameSize(
|
||||
file
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { NULL_EXTRACTED_METADATA } from 'constants/upload';
|
||||
import ffmpegService from 'services/ffmpeg/ffmpegService';
|
||||
import * as ffmpegService from 'services/ffmpeg/ffmpegService';
|
||||
import { ElectronFile } from 'types/upload';
|
||||
import { logError } from 'utils/sentry';
|
||||
import { getFileNameSize, addLogLine } from 'utils/logging';
|
||||
|
@ -8,16 +8,7 @@ export async function getVideoMetadata(file: File | ElectronFile) {
|
|||
let videoMetadata = NULL_EXTRACTED_METADATA;
|
||||
try {
|
||||
addLogLine(`getVideoMetadata called for ${getFileNameSize(file)}`);
|
||||
if (!(file instanceof File)) {
|
||||
addLogLine('get file blob for video metadata extraction');
|
||||
file = new File([await file.blob()], file.name, {
|
||||
lastModified: file.lastModified,
|
||||
});
|
||||
addLogLine(
|
||||
'get file blob for video metadata extraction successfully'
|
||||
);
|
||||
}
|
||||
videoMetadata = await ffmpegService.extractMetadata(file);
|
||||
videoMetadata = await ffmpegService.extractVideoMetadata(file);
|
||||
addLogLine(
|
||||
`videoMetadata successfully extracted ${getFileNameSize(file)}`
|
||||
);
|
||||
|
|
|
@ -35,7 +35,7 @@ export class WasmFFmpeg {
|
|||
async run(cmd: string[], inputFile: File, outputFileName: string) {
|
||||
addLogLine(`ffmpeg run called for ${inputFile.name}`);
|
||||
const response = this.ffmpegTaskQueue.queueUpRequest(() =>
|
||||
promiseWithTimeout(
|
||||
promiseWithTimeout<File>(
|
||||
this.execute(cmd, inputFile, outputFileName),
|
||||
FFMPEG_EXECUTION_WAIT_TIME
|
||||
)
|
||||
|
|
|
@ -28,12 +28,12 @@ export function initiateEmail(email: string) {
|
|||
a.rel = 'noreferrer noopener';
|
||||
a.click();
|
||||
}
|
||||
export const promiseWithTimeout = async (
|
||||
request: Promise<any>,
|
||||
export const promiseWithTimeout = async <T>(
|
||||
request: Promise<T>,
|
||||
timeout: number
|
||||
) => {
|
||||
): Promise<T> => {
|
||||
const timeoutRef = { current: null };
|
||||
const rejectOnTimeout = new Promise((_, reject) => {
|
||||
const rejectOnTimeout = new Promise<null>((_, reject) => {
|
||||
timeoutRef.current = setTimeout(
|
||||
() => reject(Error(CustomError.WAIT_TIME_EXCEEDED)),
|
||||
timeout
|
||||
|
|
|
@ -22,7 +22,7 @@ import {
|
|||
} from 'constants/file';
|
||||
import PublicCollectionDownloadManager from 'services/publicCollectionDownloadManager';
|
||||
import heicConversionService from 'services/heicConversionService';
|
||||
import ffmpegService from 'services/ffmpeg/ffmpegService';
|
||||
import * as ffmpegService from 'services/ffmpeg/ffmpegService';
|
||||
import { NEW_FILE_MAGIC_METADATA, VISIBILITY_STATE } from 'types/magicMetadata';
|
||||
import { IsArchived, updateMagicMetadataProps } from 'utils/magicMetadata';
|
||||
|
||||
|
@ -319,10 +319,9 @@ async function getRenderableLivePhoto(
|
|||
|
||||
async function getPlayableVideo(videoNameTitle: string, video: Uint8Array) {
|
||||
const mp4ConvertedVideo = await ffmpegService.convertToMP4(
|
||||
video,
|
||||
videoNameTitle
|
||||
new File([video], videoNameTitle)
|
||||
);
|
||||
return new Blob([mp4ConvertedVideo]);
|
||||
return new Blob([await mp4ConvertedVideo.arrayBuffer()]);
|
||||
}
|
||||
|
||||
async function getRenderableImage(fileName: string, imageBlob: Blob) {
|
||||
|
|
Loading…
Reference in a new issue