'use strict'; /** * test1-movie-23976fps.js * Validates: mediaAnalyzerGOP + audioSelectorClamping on a 23.976fps Film. * File: Radarr path, AC3 ITA 448k 5.1, EAC3 ENG 640k 5.1 * * Expected: * gopKeyint = "96" * gopMinKeyint = "24" * isMovie = "true" * isAnimation = "false" * vBitrate = "3000k" * audioItaCodecName = "ac3" * audioEngCodecName = "eac3" (EAC3 score > AC3 score) * audioItaOpusBitrate = "448" (clamped: min(640, 448) = 448) * audioEngOpusBitrate = "640" (clamped: min(640, 640) = 640) */ const path = require('path'); const { buildMockArgs, cleanupWorkDir, assertEqual } = require('../mock-tdarr-runtime'); const { plugin: analyzerPlugin } = require('../../LocalFlowPlugins/utility/mediaAnalyzerGOP/1.0.0/index'); const { plugin: audioPlugin } = require('../../LocalFlowPlugins/audio/audioSelectorClamping/1.0.0/index'); const FILE = path.resolve('tests/samples/media/toshiba/Radarr/Film Test (2023)/Film Test (2023).mkv'); async function run() { console.log('\n=== TEST 1: 23.976fps Film (AC3 ITA + EAC3 ENG) ===\n'); // ── Step 1: mediaAnalyzerGOP ────────────────────────────────────────────── console.log('Running mediaAnalyzerGOP...'); const args1 = buildMockArgs({ filePath: FILE, inputs: { moviePathPatterns: '/Radarr', animeSeries: '', filmBitrate: '3000', seriesBitrate: '3000', animeBitrateHd: '2000', animeBitrateSd: '1000', }, }); const out1 = await analyzerPlugin(args1); const vars = out1.variables; assertEqual(out1.outputNumber, 1, 'outputNumber'); assertEqual(vars.gopKeyint, '96', 'gopKeyint (4 x 23.976 = 95.90 -> 96)'); assertEqual(vars.gopMinKeyint,'24', 'gopMinKeyint (1 x 23.976 = 23.98 -> 24)'); assertEqual(vars.gopSceneCut, '40', 'gopSceneCut (x265 default threshold)'); assertEqual(vars.isMovie, 'true', 'isMovie (Radarr path)'); assertEqual(vars.isAnimation, 'false', 'isAnimation (no anime match)'); assertEqual(vars.vBitrate, '3000k', 'vBitrate (film default)'); assertEqual(vars.x265Tune, '', 'x265Tune (live-action)'); // ── Step 2: audioSelectorClamping ──────────────────────────────────────── console.log('\nRunning audioSelectorClamping...'); const args2 = buildMockArgs({ filePath: FILE, variables: vars, inputs: { filmMultiChannelBitrate: '640', seriesMultiChannelThreshold:'384', stereoBitrateMax: '128', }, }); const out2 = await audioPlugin(args2); const vars2 = out2.variables; assertEqual(out2.outputNumber, 1, 'outputNumber (tracks found)'); assertEqual(vars2.audioHasIta, 'true', 'audioHasIta'); assertEqual(vars2.audioHasEng, 'true', 'audioHasEng'); assertEqual(vars2.audioItaCodecName, 'ac3', 'ITA codec = ac3'); assertEqual(vars2.audioEngCodecName, 'eac3', 'ENG codec = eac3 (wins by score)'); assertEqual(vars2.audioItaOpusBitrate, '448', 'ITA Opus = 448k (min(640,448))'); assertEqual(vars2.audioEngOpusBitrate, '640', 'ENG Opus = 640k (min(640,640))'); cleanupWorkDir(args1); cleanupWorkDir(args2); console.log('\n=== TEST 1 PASSED ===\n'); } module.exports = run;