A lightweight library for decrypting MP4 files, directly in the browser
Install library as dependency for your project:
npm install shifro
Install globally to use as command-line tool:
npm install -g shifro
import { Input, StreamSource, Output, StreamTarget, Decryption } from 'shifro';
const selectFile = async () =>
new Promise<File>((resolve) => {
const input = document.querySelector<HTMLInputElement>('#input')!;
input.addEventListener('change', () => resolve(input.files![0]));
});
async function main() {
const inputFile = await selectFile();
const inputStream = inputFile.stream();
const outputFileHandle = window.showSaveFilePicker({ suggestedName: 'output.mp4', startIn: 'downloads' });
const outputStream = await outputFileHandle.createWritable();
const input = new Input({ source: new StreamSource(inputStream) });
const output = new Output({ target: new StreamTarget(outputStream) });
const decryption = await Decryption.init({
input,
output,
keys: [
{
kid: 'eb676abbcb345e96bbcf616630f1a3da',
key: '100b6c20940f779a4589152b57d2dacb',
},
],
onProgress: (progress) => console.log(`Decrypting... ${progress}`),
});
await decryption.execute();
}
import { Input, FilePathSource, Output, FilePathTarget, Decryption } from 'shifro';
async function main() {
const input = new Input({ source: new FilePathSource('./input.mp4') });
const output = new Output({ target: new FilePathTarget('./output.mp4') });
const decryption = await Decryption.init({
input,
output,
keys: [
{
kid: 'eb676abbcb345e96bbcf616630f1a3da',
key: '100b6c20940f779a4589152b57d2dacb',
},
],
onProgress: (progress) => process.stdout.write(`\rDecrypting... [${progress}]`),
});
await decryption.execute();
}
shifro --key eb676abbcb345e96bbcf616630f1a3da:100b6c20940f779a4589152b57d2dacb ./input.mp4 ./output.mp4