Merge pull request #119 from drpeppershaker/master
Tdarr_Plugin_rr01_drpeppershaker_extract_subs_to_SRTmake-only-subtitle-default
commit
e09c5b42fe
@ -0,0 +1,115 @@
|
||||
const fs = require('fs');
|
||||
|
||||
module.exports.details = function details() {
|
||||
return {
|
||||
id: 'Tdarr_Plugin_rr01_drpeppershaker_extract_subs_to_SRT',
|
||||
Stage: 'Pre-processing',
|
||||
Name: 'drpeppershaker Extract embedded subtitles and optionally remove them',
|
||||
Type: 'Video',
|
||||
Operation: 'Transcode',
|
||||
Description: 'This plugin extracts embedded subs in one pass inside Tdarr and will optionally remove them. \n\n '
|
||||
+ 'All processes happen within Tdarr without the use of any exec() functions, which lets the progress bar '
|
||||
+ 'report the status correctly. AND all subtitles are extracted in one pass, which is much faster than '
|
||||
+ 'other options.',
|
||||
// Created by drpeppershaker with help from reddit user /u/jakejones48, lots of
|
||||
// improvements made after looking at "Tdarr_Plugin_078d" by HaveAGitGat.
|
||||
Version: '1.04',
|
||||
Link: '',
|
||||
Tags: 'pre-processing,subtitle only,ffmpeg,configurable',
|
||||
Inputs: [
|
||||
{
|
||||
name: 'remove_subs',
|
||||
tooltip: `Do you want to remove subtitles after they are extracted?
|
||||
|
||||
\\nExample:\\n
|
||||
|
||||
yes
|
||||
|
||||
\\nExample:\\n
|
||||
|
||||
no
|
||||
`,
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
|
||||
module.exports.plugin = function plugin(file, librarySettings, inputs) {
|
||||
// Must return this object at some point in the function else plugin will fail.
|
||||
|
||||
const response = {
|
||||
processFile: true,
|
||||
preset: '',
|
||||
container: `.${file.container}`,
|
||||
handBrakeMode: false,
|
||||
FFmpegMode: true,
|
||||
reQueueAfter: false,
|
||||
infoLog: '',
|
||||
};
|
||||
|
||||
if (inputs.remove_subs === undefined) {
|
||||
response.processFile = false;
|
||||
response.infoLog += '☒ Inputs not entered! \n';
|
||||
return response;
|
||||
}
|
||||
|
||||
const subsArr = file.ffProbeData.streams.filter((row) => row.codec_name === 'subrip');
|
||||
|
||||
if (subsArr.length === 0) {
|
||||
response.infoLog += 'No subs in file to extract!\n';
|
||||
response.processFile = false;
|
||||
return response;
|
||||
}
|
||||
response.infoLog += 'Found subs to extract!\n';
|
||||
|
||||
let command = '-y,';
|
||||
for (let i = 0; i < subsArr.length; i += 1) {
|
||||
const subStream = subsArr[i];
|
||||
let lang = '';
|
||||
let title = 'none';
|
||||
|
||||
if (subStream.tags) {
|
||||
lang = subStream.tags.language;
|
||||
}
|
||||
|
||||
if (subStream.tags.title) {
|
||||
title = subStream.tags.title;
|
||||
}
|
||||
|
||||
let subsFile = file.file;
|
||||
subsFile = subsFile.split('.');
|
||||
subsFile[subsFile.length - 2] += `.${lang}`;
|
||||
subsFile[subsFile.length - 1] = 'srt';
|
||||
subsFile = subsFile.join('.');
|
||||
|
||||
const { index } = subStream;
|
||||
if (fs.existsSync(`${subsFile}`)) {
|
||||
response.infoLog += `${lang}.srt already exists. Skipping!\n`;
|
||||
} else if (title.toLowerCase().includes('commentary') || title.toLowerCase().includes('description')) {
|
||||
response.infoLog += `Stream ${i} ${lang}.srt is a ${title} track. Skipping!\n`;
|
||||
} else {
|
||||
response.infoLog += `Extracting ${lang}.srt\n`;
|
||||
command += ` -map 0:${index} "${subsFile}"`;
|
||||
}
|
||||
}
|
||||
|
||||
if (command === '-y,') {
|
||||
response.infoLog += 'All subs already extracted!\n';
|
||||
if (inputs.remove_subs === 'no') {
|
||||
response.processFile = false;
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
response.preset = command;
|
||||
|
||||
if (inputs.remove_subs === 'yes') {
|
||||
response.preset += ' -map 0 -map -0:s -c copy';
|
||||
}
|
||||
|
||||
if (inputs.remove_subs === 'no') {
|
||||
response.preset += ' -map 0 -c copy';
|
||||
}
|
||||
|
||||
return response;
|
||||
};
|
||||
Loading…
Reference in new issue