diff --git a/Local/Tdarr_Plugin_av1_svt_converter.js b/Local/Tdarr_Plugin_av1_svt_converter.js index ef678fd..48488b8 100644 --- a/Local/Tdarr_Plugin_av1_svt_converter.js +++ b/Local/Tdarr_Plugin_av1_svt_converter.js @@ -10,7 +10,7 @@ const details = () => ({ Features resolution-aware CRF, source-relative bitrate strategies, ab-av1 auto-CRF, and performance optimizations. **Balanced defaults**: Preset 6, CRF 26, tune 0 (VQ), 10-bit, SCD 1, AQ 2, lookahead -1, TF on, keyint -2, fast-decode 0. `, - Version: '2.33', + Version: '2.34', Tags: 'video,av1,svt,quality,performance,speed-optimized,vbr,crf,vmaf', Inputs: [ { @@ -504,8 +504,21 @@ const plugin = (file, librarySettings, inputs, otherArguments) => { // Returns { success: boolean, crf: number|null, vmaf: number|null, error: string|null } const executeAbAv1CrfSearch = (abav1Path, inputFile, vmafTarget, sampleCount, preset) => { const { execSync } = require('child_process'); + const fs = require('fs'); + const os = require('os'); + const path = require('path'); + + // Create temp directory for ffmpeg/ffprobe wrappers + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ab-av1-')); + const ffmpegWrapper = path.join(tempDir, 'ffmpeg'); + const ffprobeWrapper = path.join(tempDir, 'ffprobe'); try { + // Create wrapper scripts that call tdarr-ffmpeg + const wrapperScript = '#!/bin/sh\nexec tdarr-ffmpeg "$@"\n'; + fs.writeFileSync(ffmpegWrapper, wrapperScript, { mode: 0o755 }); + fs.writeFileSync(ffprobeWrapper, wrapperScript, { mode: 0o755 }); + // Build ab-av1 command // --min-vmaf is the target VMAF score to achieve // --samples controls how many sample segments to test @@ -522,7 +535,8 @@ const plugin = (file, librarySettings, inputs, otherArguments) => { const command = `${abav1Path} ${args.join(' ')}`; // Execute with timeout (5 minutes should be enough for sample encodes) - // Set FFMPEG and FFPROBE environment variables to point to tdarr-ffmpeg + // ab-av1 looks for 'ffmpeg' and 'ffprobe' in PATH + // Prepend temp directory to PATH so our wrappers are found first const output = execSync(command, { encoding: 'utf8', timeout: 300000, // 5 minute timeout @@ -530,8 +544,8 @@ const plugin = (file, librarySettings, inputs, otherArguments) => { stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, - FFMPEG: 'tdarr-ffmpeg', - FFPROBE: 'tdarr-ffmpeg', + // Prepend temp dir so ab-av1 finds our ffmpeg/ffprobe wrappers + PATH: `${tempDir}:${process.env.PATH || ''}`, } }); @@ -574,6 +588,15 @@ const plugin = (file, librarySettings, inputs, otherArguments) => { error: errorMsg, output: error.stderr ? error.stderr.substring(0, 500) : '' }; + } finally { + // Clean up temp directory and wrapper scripts + try { + if (fs.existsSync(ffmpegWrapper)) fs.unlinkSync(ffmpegWrapper); + if (fs.existsSync(ffprobeWrapper)) fs.unlinkSync(ffprobeWrapper); + if (fs.existsSync(tempDir)) fs.rmdirSync(tempDir); + } catch (cleanupError) { + // Ignore cleanup errors + } } }; diff --git a/PLUGIN_DOCUMENTATION.md b/PLUGIN_DOCUMENTATION.md index 37c8530..3559bb2 100644 --- a/PLUGIN_DOCUMENTATION.md +++ b/PLUGIN_DOCUMENTATION.md @@ -1,7 +1,7 @@ # Tdarr Plugin Suite Documentation > **Version**: 2025-12-16 -> **Plugins**: misc_fixes v2.8 | stream_organizer v4.10 | audio_standardizer v1.15 | av1_converter v2.33 +> **Plugins**: misc_fixes v2.8 | stream_organizer v4.10 | audio_standardizer v1.15 | av1_converter v2.34 ---