fix rest of the stuff

This commit is contained in:
Abhinav 2022-11-14 19:09:50 +05:30
parent dc3c0aaa6d
commit 6c384edba8
6 changed files with 55 additions and 72 deletions

View file

@ -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'
);
}

View file

@ -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

View 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)}`
);

View 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
)

View file

@ -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

View file

@ -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) {