96 lines
2.8 KiB
JavaScript
96 lines
2.8 KiB
JavaScript
'use strict';
|
|
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
|
|
/* eslint-disable no-param-reassign */
|
|
|
|
/**
|
|
* backupSourceAudio
|
|
* Extracts the original ITA audio track as a lossless bitstream copy,
|
|
* ONLY when the codec is DTS or TrueHD.
|
|
* Output is saved next to the source file (same directory).
|
|
*/
|
|
|
|
const BACKUP_CODECS = ['dts', 'truehd'];
|
|
const details = () => ({
|
|
name: 'Backup Source Audio (DTS / TrueHD ITA)',
|
|
description:
|
|
'Extracts the ITA audio track as a lossless bitstream copy (-c:a copy) '
|
|
+ 'when the source codec is DTS or TrueHD. '
|
|
+ 'Output is saved next to the source file. '
|
|
+ 'Silently skips if the ITA track does not require backup.',
|
|
style: { borderColor: '#F44336' },
|
|
tags: 'audio,backup',
|
|
isStartPlugin: false,
|
|
pType: '',
|
|
requiresVersion: '2.11.01',
|
|
sidebarPosition: -1,
|
|
icon: 'faSave',
|
|
inputs: [],
|
|
outputs: [
|
|
{ number: 1, tooltip: 'Continue to next plugin' },
|
|
],
|
|
});
|
|
|
|
const plugin = async (args) => {
|
|
const { jobLog, inputFileObj, variables, workDir } = args;
|
|
|
|
const inputFile = inputFileObj._id;
|
|
jobLog(`[backupSourceAudio] Processing: ${inputFile}\n`);
|
|
|
|
const hasIta = variables.audioHasIta === 'true';
|
|
const itaCodec = (variables.audioItaCodecName || '').toLowerCase();
|
|
const itaIdx = variables.audioItaStreamIndex;
|
|
|
|
if (!hasIta) {
|
|
jobLog('[backupSourceAudio] No ITA track found — skipping.\n');
|
|
return { outputNumber: 1, outputFileObj: inputFileObj, variables };
|
|
}
|
|
|
|
const needsBackup = BACKUP_CODECS.some((c) => itaCodec.includes(c));
|
|
if (!needsBackup) {
|
|
jobLog(`[backupSourceAudio] ITA codec "${itaCodec}" does not require backup — skipping.\n`);
|
|
return { outputNumber: 1, outputFileObj: inputFileObj, variables };
|
|
}
|
|
|
|
// Determine output extension
|
|
let ext = '.dts';
|
|
if (itaCodec.includes('truehd')) ext = '.thd';
|
|
|
|
const sourceDir = path.dirname(inputFile);
|
|
const baseName = path.basename(inputFile, path.extname(inputFile));
|
|
const outFile = path.join(sourceDir, `${baseName}.ita${ext}`);
|
|
|
|
jobLog(`[backupSourceAudio] Backing up ITA ${itaCodec} -> ${outFile}\n`);
|
|
|
|
const { CLI } = require('../../../../FlowHelpers/1.0.0/cliUtils');
|
|
const cli = new CLI({
|
|
cli: args.ffmpegPath,
|
|
spawnArgs: [
|
|
'-y',
|
|
'-i', inputFile,
|
|
'-map', `0:${itaIdx}`,
|
|
'-c:a', 'copy',
|
|
outFile,
|
|
],
|
|
WorkDir: workDir,
|
|
jobLog,
|
|
inputFileObj,
|
|
});
|
|
|
|
const { cliExitCode } = await cli.runCli();
|
|
|
|
if (cliExitCode !== 0) {
|
|
jobLog(`[backupSourceAudio] WARNING: FFmpeg exited with code ${cliExitCode}. Backup may be incomplete.\n`);
|
|
} else {
|
|
jobLog(`[backupSourceAudio] Backup complete: ${outFile}\n`);
|
|
variables.audioBackupPath = outFile;
|
|
}
|
|
|
|
return { outputNumber: 1, outputFileObj: inputFileObj, variables };
|
|
};
|
|
|
|
module.exports.details = details;
|
|
module.exports.plugin = plugin;
|