Major refactor to adapt new ffmpeg-core.js

This commit is contained in:
Jerome Wu
2020-04-28 19:35:57 +08:00
parent cd5fe43905
commit b36360f16f
40 changed files with 226 additions and 527 deletions

View File

@@ -0,0 +1,13 @@
const resolveURL = require('resolve-url');
const { dependencies } = require('../../package.json');
const defaultOptions = require('../constants/defaultOptions');
/*
* Default options for browser worker
*/
module.exports = {
...defaultOptions,
corePath: (typeof process !== 'undefined' && process.env.FFMPEG_ENV === 'development')
? resolveURL('/node_modules/@ffmpeg/core/ffmpeg-core.js')
: `https://unpkg.com/@ffmpeg/core@v${dependencies['@ffmpeg/core'].substring(1)}/ffmpeg-core.js`,
};

44
src/browser/fetchFile.js Normal file
View File

@@ -0,0 +1,44 @@
const resolveURL = require('resolve-url');
/**
* readFromBlobOrFile
*
* @name readFromBlobOrFile
* @function
* @access private
*/
const readFromBlobOrFile = (blob) => (
new Promise((resolve, reject) => {
const fileReader = new FileReader();
fileReader.onload = () => {
resolve(fileReader.result);
};
fileReader.onerror = ({ target: { error: { code } } }) => {
reject(Error(`File could not be read! Code=${code}`));
};
fileReader.readAsArrayBuffer(blob);
})
);
module.exports = async (_data) => {
let data = _data;
if (typeof _data === 'undefined') {
return 'undefined';
}
if (typeof _data === 'string') {
// Base64 _data
if (/data:_data\/([a-zA-Z]*);base64,([^"]*)/.test(_data)) {
data = atob(_data.split(',')[1])
.split('')
.map((c) => c.charCodeAt(0));
} else {
const res = await fetch(resolveURL(_data));
data = await res.arrayBuffer();
}
} else if (_data instanceof File || _data instanceof Blob) {
data = await readFromBlobOrFile(_data);
}
return new Uint8Array(data);
};

23
src/browser/getModule.js Normal file
View File

@@ -0,0 +1,23 @@
const { log } = require('../utils/log');
module.exports = ({ corePath }) => new Promise((resolve) => {
if (typeof window.Module === 'undefined') {
log('info', `download ffmpeg-core script (~25 MB) from ${corePath}`);
const script = document.createElement('script');
const eventHandler = () => {
script.removeEventListener('load', eventHandler);
log('info', 'initialize ffmpeg-core');
window.Module.onRuntimeInitialized = () => {
log('info', 'ffmpeg-core initialized');
resolve(window.Module);
};
};
script.src = corePath;
script.type = 'text/javascript';
script.addEventListener('load', eventHandler);
document.getElementsByTagName('head')[0].appendChild(script);
} else {
log('info', 'ffmpeg-core is loaded already');
resolve(window.Module);
}
});

9
src/browser/index.js Normal file
View File

@@ -0,0 +1,9 @@
const defaultOptions = require('./defaultOptions');
const getModule = require('./getModule');
const fetchFile = require('./fetchFile');
module.exports = {
defaultOptions,
getModule,
fetchFile,
};