Create Tdarr_Plugin_00td_action_re_order_all_streams_v2.js (#249)

make-only-subtitle-default
HaveAGitGat 4 years ago committed by GitHub
parent 7ffcd4d4f7
commit a5b230df72
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,212 @@
const details = () => ({
id: 'Tdarr_Plugin_00td_action_re_order_all_streams_v2',
Stage: 'Pre-processing',
Name: 'Re-order all streams V2',
Type: 'Video',
Operation: 'Transcode',
Description: `
This action has a built-in filter. Additional filters can be added. \n\n
This plugin re-orders all streams based on: codecs,channels,languages,streamTypes.
`,
Version: '1.00',
Tags: 'action',
Inputs: [
{
name: 'processOrder',
type: 'string',
defaultValue: 'codecs,channels,languages,streamTypes',
inputUI: {
type: 'text',
},
tooltip:
`Specify the process order.
For example, if 'languages' is first, the streams will be ordered based on that first.
\\nExample:\\n
codecs,channels,languages,streamTypes
`,
},
{
name: 'languages',
type: 'string',
defaultValue: '',
inputUI: {
type: 'text',
},
tooltip:
`Specify the language tags order, separated by commas. Leave blank to disable.
\\nExample:\\n
eng,fre
`,
},
{
name: 'channels',
type: 'string',
defaultValue: '',
inputUI: {
type: 'text',
},
tooltip:
`Specify the channels order, separated by commas. Leave blank to disable.
\\nExample:\\n
7.1,5.1,2,1`,
},
{
name: 'codecs',
type: 'string',
defaultValue: '',
inputUI: {
type: 'text',
},
tooltip:
`Specify the codec order, separated by commas. Leave blank to disable.
\\nExample:\\n
aac,ac3`,
},
{
name: 'streamTypes',
type: 'string',
defaultValue: 'video,audio,subtitle',
inputUI: {
type: 'text',
},
tooltip:
`Specify the streamTypes order, separated by commas. Leave blank to disable.
\\nExample:\\n
video,audio,subtitle
`,
},
],
});
// eslint-disable-next-line no-unused-vars
const plugin = (file, librarySettings, inputs, otherArguments) => {
const lib = require('../methods/lib')();
// eslint-disable-next-line no-unused-vars,no-param-reassign
inputs = lib.loadDefaultValues(inputs, details);
const response = {
processFile: false,
preset: '',
container: `.${file.container}`,
handBrakeMode: false,
FFmpegMode: true,
infoLog: '',
};
let { streams } = file.ffProbeData;
streams.forEach((stream, index) => {
// eslint-disable-next-line no-param-reassign
stream.typeIndex = index;
});
const originalStreams = JSON.stringify(streams);
const sortStreams = (sortType) => {
const items = sortType.inputs.split(',');
items.reverse();
for (let i = 0; i < items.length; i += 1) {
const matchedStreams = [];
for (let j = 0; j < streams.length; j += 1) {
if (String(sortType.getValue(streams[j])).includes(String(items[i]))) {
matchedStreams.push(streams[j]);
streams.splice(j, 1);
j -= 1;
}
}
streams = matchedStreams.concat(streams);
}
};
let {
processOrder,
} = inputs;
const {
languages, codecs, channels, streamTypes,
} = inputs;
const sortTypes = {
languages: {
getValue: (stream) => {
try {
return stream.tags.language;
} catch (err) {
// err
}
return '';
},
inputs: languages,
},
codecs: {
getValue: (stream) => {
try {
return stream.codec_name;
} catch (err) {
// err
}
return '';
},
inputs: codecs,
},
channels: {
getValue: (stream) => {
const chanMap = {
8: '7.1',
6: '5.1',
2: '2',
1: '1',
};
try {
if (chanMap[stream.channels]) {
return chanMap[stream.channels];
}
} catch (err) {
// err
}
return '';
},
inputs: channels,
},
streamTypes: {
getValue: (stream) => {
try {
return stream.codec_type;
} catch (err) {
// err
}
return '';
},
inputs: streamTypes,
},
};
processOrder = processOrder.split(',');
for (let k = 0; k < processOrder.length; k += 1) {
if (sortTypes[processOrder[k]] && sortTypes[processOrder[k]].inputs) {
sortStreams(sortTypes[processOrder[k]]);
}
}
if (JSON.stringify(streams) !== originalStreams) {
response.infoLog += 'Streams are not in the correct order!';
response.processFile = true;
let command = '<io> -c copy';
for (let l = 0; l < streams.length; l += 1) {
command += ` -map 0:${streams[l].typeIndex}`;
}
response.preset = command;
} else {
response.infoLog += 'Streams are in the correct order!';
}
return response;
};
module.exports.details = details;
module.exports.plugin = plugin;
Loading…
Cancel
Save