OS: Windows 10

I need help...

I'm using this script to download the video and audio fragments from the vimeo server.

''js

// 1. Open the browser developper console on the network tab
// 2. Start the video
// 3. In the dev tab, locate the load of the "master.json" file, copy its full URL
// 4. Run: node vimeo-downloader.js ""
// 5. Combine the m4v and m4a files with mkvmerge

const fs = require('fs');
const url = require('url');
const https = require('https');

let masterUrl = process.argv[2];
if (!masterUrl.endsWith('?base64_init=1')) {
masterUrl+= '?base64_init=1';
}

getJson(masterUrl, (err, json) => {
if (err) {
throw err;
}

const videoData = json.video.pop();
const audioData = json.audio.pop();

const videoBaseUrl = url.resolve(url.resolve(masterUrl, json.base_url), videoData.base_url);
const audioBaseUrl = url.resolve(url.resolve(masterUrl, json.base_url), audioData.base_url);

processFile('video', videoBaseUrl, videoData.init_segment, videoData.segments, json.clip_id + '.m4v', (err) => {
if (err) {
throw err;
}

processFile('audio', audioBaseUrl, audioData.init_segment, audioData.segments, json.clip_id + '.m4a', (err) => {
if (err) {
throw err;
}
});
});
});

function processFile(type, baseUrl, initData, segments, filename, cb) {
if (fs.existsSync(filename)) {
console.log(${type} already exists);
return cb();
}

const segmentsUrl = segments.map((seg) => baseUrl + seg.url);

const initBuffer = Buffer.from(initData, 'base64');
fs.writeFileSync(filename, initBuffer);

const output = fs.createWriteStream(filename, {flags: 'a'});

combineSegments(type, 0, segmentsUrl, output, (err) => {
if (err) {
return cb(err);
}

output.end();
cb();
});
}

function combineSegments(type, i, segmentsUrl, output, cb) {
if (i >= segmentsUrl.length) {
console.log(${type} done);
return cb();
}

console.log(Download ${type} segment ${i});

https.get(segmentsUrl[i], (res) => {
res.on('data', (d) => output.write(d));

res.on('end', () => combineSegments(type, i+1, segmentsUrl, output, cb));
}).on('error', (e) => {
cb(e);
});
}

function getJson(url, cb) {
let data = '';

https.get(url, (res) => {
res.on('data', (d) => data+= d);

res.on('end', () => cb(null, JSON.parse(data)));
}).on('error', (e) => {
cb(e);
});
}

As you can see the script creates the .m4v file for video and .m4a for audio separately.

I know ffmpeg can combine both files with a simple command line such as:

"ffmpeg -i video.mp4 -i audio.wav -c copy output.mkv"

I would like to know how to make the script run the ffmpeg command automatically, ie after downloading the .m4v and .m4a files, the script would execute the ffmpeg command and combine the files into a single .mkv by deleting the source files.

Another question is how to make the script download several URLs with a single command, as if it were a waiting list.

by the way I tried to add the following command line to the script to activate the ffmpeg function, but it did not work.

''ffmpeg command line

const exec = require('child_process').exec;

const child = exec('ffmpeg -i video.mp4 -i audio.wav -c copy output.mkv', (error, stdout, stderr) => {
if (error) {
console.error('stderr: =============================', stderr);
throw error;
}
console.log('stdout: ==========================', stdout);
});

console.log('here');