Added subtitle
Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
parent
9615600948
commit
6efcc0dabe
104
subtitle-extract
Executable file
104
subtitle-extract
Executable file
@ -0,0 +1,104 @@
|
|||||||
|
#!/usr/bin/nodejs
|
||||||
|
const { spawn } = require('child_process'),
|
||||||
|
filename = process.argv[2],
|
||||||
|
child = spawn('ffmpeg', [
|
||||||
|
'-i', filename
|
||||||
|
]),
|
||||||
|
streams = [],
|
||||||
|
basename = filename.replace(/\.[^.]+$/, "");
|
||||||
|
|
||||||
|
let output = [];
|
||||||
|
|
||||||
|
child.stdout.on('data', (data) => {
|
||||||
|
});
|
||||||
|
|
||||||
|
child.stderr.on('data', (data) => {
|
||||||
|
output += data;
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
Stream #0:2(eng): Subtitle: ass (default)
|
||||||
|
Metadata:
|
||||||
|
title : English
|
||||||
|
BPS-eng : 130
|
||||||
|
DURATION-eng : 00:47:44.040000000
|
||||||
|
...
|
||||||
|
Stream #0:4(eng): Subtitle: hdmv_pgs_subtitle
|
||||||
|
Metadata:
|
||||||
|
BPS : 3072
|
||||||
|
BPS-eng : 3072
|
||||||
|
DURATION : 00:21:51.602000000
|
||||||
|
DURATION-eng : 00:21:51.602000000
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
let stream = undefined;
|
||||||
|
|
||||||
|
child.on('close', code => {
|
||||||
|
output.toString().split('\n').forEach(line => {
|
||||||
|
const parts = line.match(/^\s*Stream\s+#([^ ]+) Subtitle:\s*([^ ]+).*$/);
|
||||||
|
if (parts && parts.length > 0) {
|
||||||
|
/* parts[1] = '0:2(eng):'
|
||||||
|
parts[2] = 'srt'
|
||||||
|
*/
|
||||||
|
if (stream) {
|
||||||
|
streams.push(stream);
|
||||||
|
}
|
||||||
|
stream = {
|
||||||
|
extension: parts[2].replace(/hdmv_pgs_subtitle/, 'sup'), /* srt, sup */
|
||||||
|
number: parts[1].replace(/^.*([^(]+).*$/, '$1'), /* 0:2 -- not used */
|
||||||
|
language: parts[1].replace(/^[^(]*\((.*)\).*$/, '$1') /* eng */
|
||||||
|
};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* We tried parsing out 'title' for the langauge title, however
|
||||||
|
* that is not a consistent standard and title seems to be used
|
||||||
|
* arbitrarily. Instead, we will rely on the 'language' we parse
|
||||||
|
* from the stream name, which is specified inISO 639-1:
|
||||||
|
|
||||||
|
https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
|
||||||
|
|
||||||
|
*/
|
||||||
|
if (stream) {
|
||||||
|
if (!stream.metadata) {
|
||||||
|
if (/^\s*Metadata:.*/.exec(line)) {
|
||||||
|
stream.metadata = true;
|
||||||
|
} else {
|
||||||
|
streams.push(stream);
|
||||||
|
stream = undefined;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const language = line.match(/^\s*title\s*:\s*([^\s]+)/);
|
||||||
|
if (language && language.length > 0) {
|
||||||
|
stream.language = language[1].toLowerCase();
|
||||||
|
streams.push(stream);
|
||||||
|
stream = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
streams.forEach((stream, index) => {
|
||||||
|
const target = `${basename}.${index}_${stream.language}.${stream.extension}`,
|
||||||
|
ffmpeg = spawn('ffmpeg', [
|
||||||
|
'-i', filename,
|
||||||
|
'-c:s', 'copy',
|
||||||
|
'-map', `0:s:${index}`,
|
||||||
|
'-y',
|
||||||
|
target
|
||||||
|
]);
|
||||||
|
console.log(`0:s:${index} => ${target}`);
|
||||||
|
|
||||||
|
ffmpeg.stdout.on('data', (data) => {
|
||||||
|
console.log(data.toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
ffmpeg.stderr.on('data', (data) => {
|
||||||
|
console.error(data.toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
ffmpeg.on('close', code => {
|
||||||
|
console.log(`Completed: ${target} ${code}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
console.log(JSON.stringify(streams));
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user