June 19Jun 19 On 6/18/2026 at 10:14 AM, Human-126094 said:Before I start planning the details — does this match what you'd expect? Anything specific about your setup I should know (e.g. how many GPUs are passed into the container, and the output of "ls -la /dev/dri" from inside the container)? That last one would help me a lot. Thanks!Sure, this sounds fine.I have two GPUs passed to the containerdrwxr-xr-x 2 root root 120 Jun 19 04:15 . drwxr-xr-x 6 root root 360 Jun 19 04:15 .. crwxrwxrwx 1 root 18 226, 0 Jun 19 04:15 card0 crw-rw---- 1 root 18 226, 1 Jun 19 04:15 card1 crwxrwxrwx 1 root 18 226, 128 Jun 19 04:15 renderD128 crwxrwxrwx 1 root 18 226, 129 Jun 19 04:15 renderD129I can help to debug and test, if necessary.
June 21Jun 21 Author 🚀 v2.31.0 - GPU Device Selection is liveghcr.io/masterjb/x265-butler:2.31.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.Pull / upgrade:docker pull ghcr.io/masterjb/x265-butler:latestdocker restart x265-butlerIf you run more than one GPU, you can now choose which one encodes. Before this, x265-butler always used the first /dev/dri/renderD* node it found - usually the Intel iGPU - so a discrete card like an Arc A380 was never picked up and there was no way to override it. This release adds a GPU device picker.🎛️ WHAT'S NEW• New "GPU Device" picker in Settings → Encoder, and a matching one in the first-run onboarding hardware step.• Both lists are filled from a live probe of your /dev/dri/renderD* nodes - you select the actual device you want (e.g. the Arc).• Leave it on "Auto" (the default) and nothing changes - single-GPU setups and anyone who never touches the setting are completely unaffected.• The picked node is now passed explicitly to both QSV and VAAPI; no container restart needed when you change it.Multi-GPU folks (especially Intel iGPU + Arc): I don't have that hardware here, so this is the build to test it on. If your discrete card now shows up and encodes - great, let me know. If it binds but throws "Current pixel format is unsupported", please post the container log so I can chase it. To revert instantly, just set GPU Device back to Auto.🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:Extra Parameters:--runtime=nvidiaVariables:NVIDIA_VISIBLE_DEVICES = allNVIDIA_DRIVER_CAPABILITIES = compute,video,utilityThe "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.♻️ ROLLBACKIf v2.31.0 misbehaves on your hardware, roll back to the previous image:docker stop x265-butler && docker rm x265-butlerdocker pull ghcr.io/masterjb/x265-butler:2.30.0🔭 COMING NEXT• Auto-crop / black-bar removal - optional cropdetect pass to strip letterbox/pillarbox bars during the encode (the Handbrake crop=auto equivalent).Plans can change, but that's what's next on the bench.
June 21Jun 21 Author Hi @cmeyer86 thanks for the detailed report.Trash on a separate path: this is already possible. Open Settings and look for the Trash Path field. Leave it empty to keep the trash on the cache pool, or point it at an array share so the files can live there for the retention window (default 30 days). The path is fully adjustable.Queue picking up already encoded files: I could reproduce the cause and added a fix to the pipeline. It will land in one of the next releases.Progress bar: both points (the bar disappearing, and one bar per encode when parallelism is 2 or higher) are queued as well and ship in the same line of updates.Cheers
June 22Jun 22 Author 🚀 v2.32.0 - Auto-Crop / Black-Bar Removal is liveghcr.io/masterjb/x265-butler:2.32.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.Pull / upgrade:docker pull ghcr.io/masterjb/x265-butler:latestdocker restart x265-butlerThis one is for everyone with letterboxed or pillarboxed sources (black bars baked into the picture). x265-butler can now detect and crop those bars out during the encode - the same idea as Handbrake's "crop = auto". Cropping the dead bars saves bitrate and gives a cleaner output.✂️ AUTO-CROP + MANUAL OVERRIDENew card under Settings -> Encoder -> Auto-Crop, with two controls:• Auto-Crop toggle - runs an ffmpeg cropdetect pass on a short sample of each source, figures out the crop, and applies it to the encode automatically. Per-file, so each title gets its own crop.• Crop override (W:H:X:Y) - a fixed geometry for when you already know the exact crop, or when auto-detect guesses wrong. A valid override wins over the toggle, so you can leave Auto-Crop off and still force one specific crop. Bad/odd values are rejected right in the form and at the API, so you get told immediately instead of a failed encode later.The first-run onboarding now mentions where to find this too.Both controls are OFF by default. If you do not touch them, the encode is byte-identical to v2.31.x - nothing changes for you. Works across libx265, NVENC, QSV and VAAPI.🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:Extra Parameters:--runtime=nvidiaVariables:NVIDIA_VISIBLE_DEVICES = allNVIDIA_DRIVER_CAPABILITIES = compute,video,utilityThe "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.♻️ ROLLBACKIf v2.32.0 misbehaves on your hardware, roll back to the previous image:docker stop x265-butler && docker rm x265-butlerdocker pull ghcr.io/masterjb/x265-butler:2.31.0🔭 COMING NEXT• Central-sidecar re-queue fix - if you store sidecars centrally and keep the source files, rescans can re-queue already-encoded files. A write-side fix is planned.• Per-encode progress bars - the queue progress bar can disappear, and with parallelism set to 2 or more each running encode should show its own bar.Feedback and crop results from real hardware welcome - especially QSV/VAAPI/NVENC, since I cannot test the cropped HW encode locally.
June 22Jun 22 Author 🚀 v2.33.0 - Re-Queue, Queue Progress & Cache-Path Fixes is liveghcr.io/masterjb/x265-butler:2.33.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.Pull / upgrade:docker pull ghcr.io/masterjb/x265-butler:latestdocker restart x265-butlerThis is a plumbing release - three operator-reported fixes in the queue/encode path, no codec or quality changes.🛠️ WHAT CHANGED• Cache-path EACCES fix for older installs. If you installed before v2.21 you carry a stored cache path of /mnt/cache/x265-butler (the old hard-coded default). Since v2.21 any stored value is treated as a manual override and used as-is with no writability check - so on any host that doesn't map /mnt/cache/x265-butler into the container, every encode failed with cache_pool_unavailable:EACCES. v2.33.0 adds a one-time boot migration that drops ONLY that exact legacy-default value, so it auto-resolves again (writable /mnt/cache -> same path; otherwise falls back to /config/cache). A real custom cache path is never touched.• Central-sidecar source re-queue fix. In central sidecar + suffix mode, a smaller re-encode kept the source but never wrote a source-keyed sidecar for it, so rescans kept re-queueing already-encoded files. The marker is now written on that path - rescans stop redoing finished work.• Per-job queue progress bars. The progress bar could vanish mid-encode, and with parallelism >=2 the concurrent encodes collapsed onto one bar. Each concurrent encode now shows its own live progress bar.🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:Extra Parameters:--runtime=nvidiaVariables:NVIDIA_VISIBLE_DEVICES = allNVIDIA_DRIVER_CAPABILITIES = compute,video,utilityThe "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.♻️ ROLLBACKIf v2.33.0 misbehaves on your hardware, roll back to the previous image:docker stop x265-butler && docker rm x265-butlerdocker pull ghcr.io/masterjb/x265-butler:2.32.0🔭 COMING NEXT• Route the job-log retention sweep through the cache-path resolver (so log retention keeps running after the cache-path fix above).• More operator-reported stabilization across the queue, encode, and storage surfaces.
June 22Jun 22 Hi,I wanted to try the new black bars settings (thanks again !) in x265 (CPU) but realize that it just does nothing...I've even tried previous images, including the first one I tried (2.13.0 which I'm almost sure was working) but cannot get any encoding to work...I have verified all my settings, tried from fresh images, still the same behavior : when I click Encode now it goes to the queue and shows the name of the file with no progress at all :My Unraid CPU does absolutely nothing, and even the Test Encode gives an error :Encoder logs :19eefa977bb Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/cache/x265-butler/work/1/input':19eefa977bb Metadata:19eefa977bb major_brand : qt19eefa977bb minor_version : 019eefa977bb compatible_brands: qt19eefa977bb creation_time : 2026-06-16T18:07:40.000000Z19eefa977bb com.apple.quicktime.location.accuracy.horizontal: 14.414267com.apple.quicktime.full-frame-rate-playback-intent: 019eefa977bc19eefa977bc com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/19eefa977bc com.apple.quicktime.make: Apple19eefa977bc com.apple.quicktime.model: iPhone 15 Pro19eefa977bc com.apple.quicktime.software: 26.519eefa977bc com.apple.quicktime.creationdate: 2026-06-16T20:07:40+020019eefa977bc Duration: 00:17:45.81, start: 0.000000, bitrate: 64891 kb/s19eefa977bc Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 64440 kb/s, 59.96 fps, 59.94 tbr, 600 tbn (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Video19eefa977bc vendor_id : [0][0][0][0]19eefa977bc encoder : HEVC19eefa977bc Side data:19eefa977bc DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 019eefa977bc Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.32900019eefa977bc Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 198 kb/s (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Audio19eefa977bc vendor_id : [0][0][0][0]19eefa977bc Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977bc Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 59 kb/s (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977bc Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 156 kb/s (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977bc Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977bc Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D) (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977be Stream mapping:19eefa977be Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))19eefa977be Stream #0:1 -> #0:1 (copy)19eefa977be Stream #0:2 -> #0:2 (copy)Stream #0:3 -> #0:319eefa977be (copy)19eefa977be Stream #0:4 -> #0:4 (copy)19eefa977be Stream #0:5 -> #0:5 (copy)19eefa977be Stream #0:6 -> #0:6 (copy)19eefa977bf Press [q] to stop, [?] for help19eefa97930 x265 [info]: HEVC encoder version 4.2+5-7b3d1f5119eefa97930 x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit19eefa97931 x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX219eefa97931 x265 [info]: Main 10 profile, Level-5.1 (Main tier)19eefa97931 x265 [info]: Thread pool created using 128 threads19eefa97934 x265 [info]: Thread pool created using 21914 threads19eefa97934 x265 [info]: Slices : 119eefa97934 x265 [info]: frame threads / pool features : 6 / wpp(34 rows)Container logs :x265-butler: LIBVA_DRIVER_NAME unset (no Intel PCI device; Mesa/NVENC autodetect)▲ Next.js 15.5.18- Local: http://localhost:3000- Network: http://0.0.0.0:3000✓ Starting...✓ Ready in 366ms{"level":30,"time":1782137172903,"pid":7,"hostname":"5ccc3af18555","migration":"0028","action":"migrated_default_output_suffix","from":".x265.mkv","to":"-x265","rowsAffected":1,"msg":"16-05: default output_suffix migrated"}{"level":30,"time":1782137172930,"pid":7,"hostname":"5ccc3af18555","action":"server_init","msg":"server init complete"}{"level":40,"time":1782137172930,"pid":7,"hostname":"5ccc3af18555","action":"legacy_cache_path_migrated","removed":"/mnt/cache/x265-butler","msg":"deleted legacy default cache_pool_path row → DC-B auto-resolve"}{"level":30,"time":1782137172940,"pid":7,"hostname":"5ccc3af18555","action":"encoder_loop_start","recoveredStaleEncoding":0,"recoveredFiles":[],"recoveredFileRows":0,"msg":"encoder loop started"}{"level":30,"time":1782137172956,"pid":7,"hostname":"5ccc3af18555","action":"encoder_loop_capacity","cpuCount":128,"concurrencySetting":"auto","limits":{"libx265":8,"nvenc":1,"qsv":1,"vaapi":1},"msg":"encoder loop capacity computed"}{"level":30,"time":1782137172976,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/logs","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}{"level":40,"time":1782137172981,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}{"level":30,"time":1782137173060,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":103,"msg":"encoder detection complete"}{"level":30,"time":1782137173089,"pid":7,"hostname":"5ccc3af18555","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":0}],"msg":"multi-share scan complete"}{"level":30,"time":1782137173090,"pid":7,"hostname":"5ccc3af18555","action":"auto_scan_reconcile_complete","reconcileCount":0,"orphanReEnqueueCount":0,"durationMs":121,"msg":"auto-scan reconcile complete"}{"level":30,"time":1782137177565,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","effectiveFilters":{"resolvedRootPath":"/media","extensions":["mp4","mkv","avi","mov","m4v","webm","ts","m2ts","wmv"],"minSizeMb":50,"maxDepth":12},"msg":"scan starting"}{"level":30,"time":1782137177566,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":0}],"msg":"multi-share scan complete"}{"level":30,"time":1782137177566,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","filesScanned":0,"filesAdded":0,"filesUpdated":0,"filesUnchanged":0,"filesFailed":0,"filesVanished":0,"byShareCount":1,"durationMs":1,"msg":"scan complete"}{"level":30,"time":1782137177609,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/library","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}{"level":30,"time":1782137181665,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","key":"autoScan.enabled","oldValue":"true","newValue":"false","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137181665,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","action":"auto_scan_setting_changed","changes":[{"key":"autoScan.enabled","oldValue":"true","newValue":"false"}],"msg":"auto-scan settings mutated"}{"level":30,"time":1782137182167,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","action":"auto_scan_disabled","msg":"auto-scan disabled — service idle"}{"level":30,"time":1782137183201,"pid":7,"hostname":"5ccc3af18555","requestId":"24e36873-73fb-4b63-88c1-7264b7181f30","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137199990,"pid":7,"hostname":"5ccc3af18555","requestId":"1516dd8f-57de-4beb-bb53-914ae1232d32","route":"/api/events","action":"sse_stream_closed","durationMs":25702,"deliveredCount":1,"droppedCount":0,"msg":"SSE stream closed"}{"level":30,"time":1782137200086,"pid":7,"hostname":"5ccc3af18555","action":"wizard_entered","locale":"en","fileCount":0,"autoSkipPathsStep":true,"share_id":1,"placeholderSharePath":"/media","msg":"first-run wizard rendered"}{"level":30,"time":1782137200092,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/onboarding","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}{"level":40,"time":1782137201769,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}{"level":30,"time":1782137201770,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":7,"msg":"encoder detection complete"}{"level":30,"time":1782137201781,"pid":7,"hostname":"5ccc3af18555","requestId":"fcd8a853-171f-465e-9ff0-0c89445549d4","route":"/api/encoders/refresh","action":"encoders_refreshed","detected":["libx265"],"active":"libx265","resolution":"auto","previousActive":"auto","msg":"encoder cache invalidated + re-probed + perEncoderLimits recomputed"}{"level":30,"time":1782137201781,"pid":7,"hostname":"5ccc3af18555","requestId":"fcd8a853-171f-465e-9ff0-0c89445549d4","route":"/api/encoders/refresh","action":"encoders_active_changed","from":"auto","to":"libx265","msg":"active encoder changed"}{"level":30,"time":1782137221953,"pid":7,"hostname":"5ccc3af18555","requestId":"6561bfc3-d2c6-40b5-b92e-e9f5733c27e0","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_libx265","oldValue":"23","newValue":"20","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_nvenc","oldValue":"23","newValue":"18","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_qsv","oldValue":"22","newValue":"22","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_vaapi","oldValue":"22","newValue":"22","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"onboarding_share_updated","shareId":1,"before":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137172},"after":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137229},"msg":"placeholder share PATCHed via onboarding"}{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"onboarding_completed","timestamp":1782137229,"shareAction":"updated","shareId":1,"msg":"first-run wizard completed"}{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"wizard_completed_via_auto_skip_path","share_path":"/media","share_id":1,"locale":"fr,fr-FR;q=0.9,en-US;q=0.8,en;q=0.7","msg":"wizard completed via skip-branch — no path override"}{"level":30,"time":1782137253623,"pid":7,"hostname":"5ccc3af18555","requestId":"a0246b0b-c24f-4151-bdf3-27fe8e871976","route":"/api/settings","requestId":"a0246b0b-c24f-4151-bdf3-27fe8e871976","key":"cache_pool_path","oldValue":null,"newValue":"/mnt/cache/x265-butler","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137253657,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}{"level":30,"time":1782137255950,"pid":7,"hostname":"5ccc3af18555","requestId":"788c7555-4b32-4240-b666-218941d3082e","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"preset_libx265","oldValue":"medium","newValue":"slow","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"preset_nvenc","oldValue":"p5","newValue":"p7","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"sidecar_mode","oldValue":null,"newValue":"central","action":"settings_change","msg":"settings_change"}{"level":40,"time":1782137268735,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}{"level":30,"time":1782137268736,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":7,"msg":"encoder detection complete"}{"level":30,"time":1782137268744,"pid":7,"hostname":"5ccc3af18555","requestId":"ef9bf7bd-42a2-45f1-81b2-951c21e8d87b","route":"/api/encoders/refresh","action":"encoders_refreshed","detected":["libx265"],"active":"libx265","resolution":"auto","previousActive":"auto","msg":"encoder cache invalidated + re-probed + perEncoderLimits recomputed"}{"level":30,"time":1782137268744,"pid":7,"hostname":"5ccc3af18555","requestId":"ef9bf7bd-42a2-45f1-81b2-951c21e8d87b","route":"/api/encoders/refresh","action":"encoders_active_changed","from":"auto","to":"libx265","msg":"active encoder changed"}{"level":30,"time":1782137268778,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}{"level":30,"time":1782137269127,"pid":7,"hostname":"5ccc3af18555","requestId":"639b2ab6-654a-47f7-8599-e93cfb4c6623","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137273162,"pid":7,"hostname":"5ccc3af18555","requestId":"a7507ffa-2f3d-45d1-afa0-a840256b0093","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137277616,"pid":7,"hostname":"5ccc3af18555","requestId":"2ad36338-9f42-408d-98b1-9fb1c0c10c82","route":"/api/settings","requestId":"2ad36338-9f42-408d-98b1-9fb1c0c10c82","key":"auto_crop","oldValue":null,"newValue":"true","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137277669,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}{"level":30,"time":1782137278112,"pid":7,"hostname":"5ccc3af18555","requestId":"e8a9e8aa-ff4a-44e9-88bf-63dcdb96edfd","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137296659,"pid":7,"hostname":"5ccc3af18555","requestId":"da916cea-b34c-4d63-9fe8-0c744046c9ce","route":"/api/shares/[id]","action":"share_updated","shareId":1,"before":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137229},"after":{"id":1,"name":"Library","path":"/library","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137296},"actor":"anonymous","msg":"share updated"}{"level":30,"time":1782137299767,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","effectiveFilters":{"resolvedRootPath":"/library","extensions":["mp4","mkv","avi","mov","m4v","webm","ts","m2ts","wmv"],"minSizeMb":50,"maxDepth":12},"msg":"scan starting"}{"level":30,"time":1782137300660,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":9}],"msg":"multi-share scan complete"}{"level":30,"time":1782137300661,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","filesScanned":9,"filesAdded":9,"filesUpdated":0,"filesUnchanged":0,"filesFailed":0,"filesVanished":0,"byShareCount":1,"durationMs":893,"msg":"scan complete"}{"level":30,"time":1782137300715,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/library","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}{"level":30,"time":1782137311679,"pid":7,"hostname":"5ccc3af18555","requestId":"2e5edd5f-c43a-46bd-874c-925435145665","route":"/api/queue","method":"POST","action":"enqueue","jobId":1,"fileId":6,"encoder":"libx265","msg":"job enqueued"}{"level":30,"time":1782137312303,"pid":7,"hostname":"5ccc3af18555","action":"job_transition","jobId":1,"fileId":6,"transition":"queued→encoding","encoder":"libx265","msg":"job transition: queued→encoding"}{"level":30,"time":1782137312304,"pid":7,"hostname":"5ccc3af18555","jobId":1,"encoder":"libx265","presetResolved":"slow","presetSource":"settings","msg":"dispatch_preset_resolved"}{"level":30,"time":1782137312309,"pid":7,"hostname":"5ccc3af18555","jobId":1,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/mnt/cache/x265-butler/work/1/input","statfs_ok":true},{"path":"/mnt/cache/x265-butler/work/1/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/library/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}],"msg":"preflight_statfs_probe"}{"level":30,"time":1782137321223,"pid":7,"hostname":"5ccc3af18555","action":"crop_detect","inputPath":"/library/IMG_5450.MOV","durationMs":8913,"result":"3840:2160:0:0","msg":"cropdetect pre-pass complete"}{"level":30,"time":1782137405958,"pid":7,"hostname":"5ccc3af18555","event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0,"msg":"diagnostics.page.opened"}{"level":30,"time":1782137406149,"pid":7,"hostname":"5ccc3af18555","event":"copyReportGated","source":"diagnostics-client","msg":"diagnostics.log-event"}{"level":30,"time":1782137572324,"pid":7,"hostname":"5ccc3af18555","event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0,"msg":"diagnostics.page.opened"}{"level":30,"time":1782137572388,"pid":7,"hostname":"5ccc3af18555","requestId":"13cb3c2b-fff1-4963-afc2-b32a0260b3d8","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"1","droppedLineCount":0,"lastReadOffset":3965,"requestId":"13cb3c2b-fff1-4963-afc2-b32a0260b3d8","msg":"log SSE stream closed"}{"level":30,"time":1782137572418,"pid":7,"hostname":"5ccc3af18555","event":"copyReportGated","source":"diagnostics-client","msg":"diagnostics.log-event"}{"level":30,"time":1782137575706,"pid":7,"hostname":"5ccc3af18555","encoder":"libx265","durationMs":6,"outcome":"failed","exitCode":null,"msg":"testEncodeTriggered"}{"level":30,"time":1782137575729,"pid":7,"hostname":"5ccc3af18555","event":"copyReportUnlocked","source":"diagnostics-client","outcome":"killed_timeout","encoderPicked":"libx265","msg":"diagnostics.log-event"}EDIT : forgot to post the Diagnostic Report :x265-butler diagnostics report## x265-butler diagnostics report### App- version: 2.33.0- gitHash: 9c2b8daa- committedAt: 1782125397- committedAtCET: 22.06.26, 12:49:57### Runtime- nodeVersion: v22.23.0- platform: linux- arch: x64- uptimeSec: 237- pid: 7### Mounts| path | readable | writable | error ||---|---|---|---|| /media | ✓ | ✓ | || /cache | ✓ | ✓ | || /config | ✓ | ✓ | |### Cache- effectivePath: /cache- resolution: user-override- settingValue: /cache- writable: ✓### Devices- DRI: none- NVIDIA: none### Encoders- detected: libx265- detection warnings: none- probe outcomes: - nvenc: missing - qsv: missing - vaapi: missing - libx265: functional### Active warningsno warnings### Recent errors (in-memory, last ≤25)no recent errors### Onboarding- completed: ✓- hasShare: ✓## Container Image- OS: Debian GNU/Linux 13 (trixie)- GLIBC: 2.41- Intel Media Driver: — (so-symlink)- libva: 2.22.0-3- libdrm: 2.4.124-2- oneVPL MFX runtime (libmfx-gen1.2): 25.1.4-1- oneVPL dispatcher (libvpl2): 1:2.14.0-1+b1- libigfxcmrt7: 25.2.3+dfsg1-1- (oneVPL versions report installed-package presence; runtime QSV-functionality is verified separately by the probe-encode — 23-04)- ffmpeg version: N-125095-g364d309af8-20260618<details><summary>ffmpeg configuration flags</summary>```--prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618```</details>## CPU- Vendor: AuthenticAMD- Model name: AMD Ryzen Threadripper 3990X 64-Core Processor- CPUID family/model: 23 / 49- Microarch: —- Graphics gen: —- HEVC-QSV (hardware): unknown- (HEVC-QSV reflects iGPU HARDWARE capability by the embedded gen-table; runtime QSV functionality is verified separately by the probe-encode — 23-04)## Blocklist Evaluation<!-- Operator: paths below are verbatim. Redact mount/user prefixes before posting if sensitive. -->- Total entries: 0- Pattern cache: 2026-06-22T19:18:02.755ZNo recent evaluations.## Slow RequestsNo slow requests recorded (threshold: 1s).## Slow QueriesNo slow queries recorded (threshold: 100ms).## Web VitalsNo web vitals recorded.## DRI Render DevicesNo render devices found (no /dev/dri).### Last test-encode (client UAT run)- outcome: killed_timeout- encoderPicked: libx265- durationMs: 10663- exitCode: (killed)stderr:```Input #0, lavfi, from 'testsrc=size=320x240:rate=1:duration=5': Duration: N/A, start: 0.000000, bitrate: N/A Stream #0:0: Video: wrapped_avframe, rgb24, 320x240 [SAR 1:1 DAR 4:3], 1 fps, 1 tbr, 1 tbnStream mapping: Stream #0:0 -> #0:0 (wrapped_avframe (native) -> hevc (libx265))Press [q] to stop, [?] for helpx265 [info]: HEVC encoder version 4.2+5-7b3d1f51x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 8bit+10bit+12bitx265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2x265 [warning]: halving the quality when psy-rd is enabled for 444 input. Setting cbQpOffset = 6 and crQpOffset = 6x265 [info]: Main 4:4:4 profile, Level-2 (Main tier)x265 [info]: Thread pool created using 128 threads```Generated 2026-06-22T19:19:07.738Z Edited June 22Jun 22 by tbal82
June 22Jun 22 Author 5 hours ago, tbal82 said:Hi,I wanted to try the new black bars settings (thanks again !) in x265 (CPU) but realize that it just does nothing...I've even tried previous images, including the first one I tried (2.13.0 which I'm almost sure was working) but cannot get any encoding to work...I have verified all my settings, tried from fresh images, still the same behavior : when I click Encode now it goes to the queue and shows the name of the file with no progress at all :My Unraid CPU does absolutely nothing, and even the Test Encode gives an error :Encoder logs :19eefa977bb Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/cache/x265-butler/work/1/input':19eefa977bb Metadata:19eefa977bb major_brand : qt19eefa977bb minor_version : 019eefa977bb compatible_brands: qt19eefa977bb creation_time : 2026-06-16T18:07:40.000000Z19eefa977bb com.apple.quicktime.location.accuracy.horizontal: 14.414267com.apple.quicktime.full-frame-rate-playback-intent: 019eefa977bc19eefa977bc com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/19eefa977bc com.apple.quicktime.make: Apple19eefa977bc com.apple.quicktime.model: iPhone 15 Pro19eefa977bc com.apple.quicktime.software: 26.519eefa977bc com.apple.quicktime.creationdate: 2026-06-16T20:07:40+020019eefa977bc Duration: 00:17:45.81, start: 0.000000, bitrate: 64891 kb/s19eefa977bc Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 64440 kb/s, 59.96 fps, 59.94 tbr, 600 tbn (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Video19eefa977bc vendor_id : [0][0][0][0]19eefa977bc encoder : HEVC19eefa977bc Side data:19eefa977bc DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 019eefa977bc Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.32900019eefa977bc Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 198 kb/s (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Audio19eefa977bc vendor_id : [0][0][0][0]19eefa977bc Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977bc Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 59 kb/s (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977bc Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 156 kb/s (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977bc Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977bc Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D) (default)19eefa977bc Metadata:19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z19eefa977bc handler_name : Core Media Metadata19eefa977be Stream mapping:19eefa977be Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))19eefa977be Stream #0:1 -> #0:1 (copy)19eefa977be Stream #0:2 -> #0:2 (copy)Stream #0:3 -> #0:319eefa977be (copy)19eefa977be Stream #0:4 -> #0:4 (copy)19eefa977be Stream #0:5 -> #0:5 (copy)19eefa977be Stream #0:6 -> #0:6 (copy)19eefa977bf Press [q] to stop, [?] for help19eefa97930 x265 [info]: HEVC encoder version 4.2+5-7b3d1f5119eefa97930 x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit19eefa97931 x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX219eefa97931 x265 [info]: Main 10 profile, Level-5.1 (Main tier)19eefa97931 x265 [info]: Thread pool created using 128 threads19eefa97934 x265 [info]: Thread pool created using 21914 threads19eefa97934 x265 [info]: Slices : 119eefa97934 x265 [info]: frame threads / pool features : 6 / wpp(34 rows)Container logs :x265-butler: LIBVA_DRIVER_NAME unset (no Intel PCI device; Mesa/NVENC autodetect)▲ Next.js 15.5.18- Local: http://localhost:3000- Network: http://0.0.0.0:3000✓ Starting...✓ Ready in 366ms{"level":30,"time":1782137172903,"pid":7,"hostname":"5ccc3af18555","migration":"0028","action":"migrated_default_output_suffix","from":".x265.mkv","to":"-x265","rowsAffected":1,"msg":"16-05: default output_suffix migrated"}{"level":30,"time":1782137172930,"pid":7,"hostname":"5ccc3af18555","action":"server_init","msg":"server init complete"}{"level":40,"time":1782137172930,"pid":7,"hostname":"5ccc3af18555","action":"legacy_cache_path_migrated","removed":"/mnt/cache/x265-butler","msg":"deleted legacy default cache_pool_path row → DC-B auto-resolve"}{"level":30,"time":1782137172940,"pid":7,"hostname":"5ccc3af18555","action":"encoder_loop_start","recoveredStaleEncoding":0,"recoveredFiles":[],"recoveredFileRows":0,"msg":"encoder loop started"}{"level":30,"time":1782137172956,"pid":7,"hostname":"5ccc3af18555","action":"encoder_loop_capacity","cpuCount":128,"concurrencySetting":"auto","limits":{"libx265":8,"nvenc":1,"qsv":1,"vaapi":1},"msg":"encoder loop capacity computed"}{"level":30,"time":1782137172976,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/logs","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}{"level":40,"time":1782137172981,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}{"level":30,"time":1782137173060,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":103,"msg":"encoder detection complete"}{"level":30,"time":1782137173089,"pid":7,"hostname":"5ccc3af18555","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":0}],"msg":"multi-share scan complete"}{"level":30,"time":1782137173090,"pid":7,"hostname":"5ccc3af18555","action":"auto_scan_reconcile_complete","reconcileCount":0,"orphanReEnqueueCount":0,"durationMs":121,"msg":"auto-scan reconcile complete"}{"level":30,"time":1782137177565,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","effectiveFilters":{"resolvedRootPath":"/media","extensions":["mp4","mkv","avi","mov","m4v","webm","ts","m2ts","wmv"],"minSizeMb":50,"maxDepth":12},"msg":"scan starting"}{"level":30,"time":1782137177566,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":0}],"msg":"multi-share scan complete"}{"level":30,"time":1782137177566,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","filesScanned":0,"filesAdded":0,"filesUpdated":0,"filesUnchanged":0,"filesFailed":0,"filesVanished":0,"byShareCount":1,"durationMs":1,"msg":"scan complete"}{"level":30,"time":1782137177609,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/library","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}{"level":30,"time":1782137181665,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","key":"autoScan.enabled","oldValue":"true","newValue":"false","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137181665,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","action":"auto_scan_setting_changed","changes":[{"key":"autoScan.enabled","oldValue":"true","newValue":"false"}],"msg":"auto-scan settings mutated"}{"level":30,"time":1782137182167,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","action":"auto_scan_disabled","msg":"auto-scan disabled — service idle"}{"level":30,"time":1782137183201,"pid":7,"hostname":"5ccc3af18555","requestId":"24e36873-73fb-4b63-88c1-7264b7181f30","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137199990,"pid":7,"hostname":"5ccc3af18555","requestId":"1516dd8f-57de-4beb-bb53-914ae1232d32","route":"/api/events","action":"sse_stream_closed","durationMs":25702,"deliveredCount":1,"droppedCount":0,"msg":"SSE stream closed"}{"level":30,"time":1782137200086,"pid":7,"hostname":"5ccc3af18555","action":"wizard_entered","locale":"en","fileCount":0,"autoSkipPathsStep":true,"share_id":1,"placeholderSharePath":"/media","msg":"first-run wizard rendered"}{"level":30,"time":1782137200092,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/onboarding","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}{"level":40,"time":1782137201769,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}{"level":30,"time":1782137201770,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":7,"msg":"encoder detection complete"}{"level":30,"time":1782137201781,"pid":7,"hostname":"5ccc3af18555","requestId":"fcd8a853-171f-465e-9ff0-0c89445549d4","route":"/api/encoders/refresh","action":"encoders_refreshed","detected":["libx265"],"active":"libx265","resolution":"auto","previousActive":"auto","msg":"encoder cache invalidated + re-probed + perEncoderLimits recomputed"}{"level":30,"time":1782137201781,"pid":7,"hostname":"5ccc3af18555","requestId":"fcd8a853-171f-465e-9ff0-0c89445549d4","route":"/api/encoders/refresh","action":"encoders_active_changed","from":"auto","to":"libx265","msg":"active encoder changed"}{"level":30,"time":1782137221953,"pid":7,"hostname":"5ccc3af18555","requestId":"6561bfc3-d2c6-40b5-b92e-e9f5733c27e0","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_libx265","oldValue":"23","newValue":"20","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_nvenc","oldValue":"23","newValue":"18","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_qsv","oldValue":"22","newValue":"22","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_vaapi","oldValue":"22","newValue":"22","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"onboarding_share_updated","shareId":1,"before":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137172},"after":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137229},"msg":"placeholder share PATCHed via onboarding"}{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"onboarding_completed","timestamp":1782137229,"shareAction":"updated","shareId":1,"msg":"first-run wizard completed"}{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"wizard_completed_via_auto_skip_path","share_path":"/media","share_id":1,"locale":"fr,fr-FR;q=0.9,en-US;q=0.8,en;q=0.7","msg":"wizard completed via skip-branch — no path override"}{"level":30,"time":1782137253623,"pid":7,"hostname":"5ccc3af18555","requestId":"a0246b0b-c24f-4151-bdf3-27fe8e871976","route":"/api/settings","requestId":"a0246b0b-c24f-4151-bdf3-27fe8e871976","key":"cache_pool_path","oldValue":null,"newValue":"/mnt/cache/x265-butler","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137253657,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}{"level":30,"time":1782137255950,"pid":7,"hostname":"5ccc3af18555","requestId":"788c7555-4b32-4240-b666-218941d3082e","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"preset_libx265","oldValue":"medium","newValue":"slow","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"preset_nvenc","oldValue":"p5","newValue":"p7","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"sidecar_mode","oldValue":null,"newValue":"central","action":"settings_change","msg":"settings_change"}{"level":40,"time":1782137268735,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}{"level":30,"time":1782137268736,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":7,"msg":"encoder detection complete"}{"level":30,"time":1782137268744,"pid":7,"hostname":"5ccc3af18555","requestId":"ef9bf7bd-42a2-45f1-81b2-951c21e8d87b","route":"/api/encoders/refresh","action":"encoders_refreshed","detected":["libx265"],"active":"libx265","resolution":"auto","previousActive":"auto","msg":"encoder cache invalidated + re-probed + perEncoderLimits recomputed"}{"level":30,"time":1782137268744,"pid":7,"hostname":"5ccc3af18555","requestId":"ef9bf7bd-42a2-45f1-81b2-951c21e8d87b","route":"/api/encoders/refresh","action":"encoders_active_changed","from":"auto","to":"libx265","msg":"active encoder changed"}{"level":30,"time":1782137268778,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}{"level":30,"time":1782137269127,"pid":7,"hostname":"5ccc3af18555","requestId":"639b2ab6-654a-47f7-8599-e93cfb4c6623","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137273162,"pid":7,"hostname":"5ccc3af18555","requestId":"a7507ffa-2f3d-45d1-afa0-a840256b0093","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137277616,"pid":7,"hostname":"5ccc3af18555","requestId":"2ad36338-9f42-408d-98b1-9fb1c0c10c82","route":"/api/settings","requestId":"2ad36338-9f42-408d-98b1-9fb1c0c10c82","key":"auto_crop","oldValue":null,"newValue":"true","action":"settings_change","msg":"settings_change"}{"level":30,"time":1782137277669,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}{"level":30,"time":1782137278112,"pid":7,"hostname":"5ccc3af18555","requestId":"e8a9e8aa-ff4a-44e9-88bf-63dcdb96edfd","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}{"level":30,"time":1782137296659,"pid":7,"hostname":"5ccc3af18555","requestId":"da916cea-b34c-4d63-9fe8-0c744046c9ce","route":"/api/shares/[id]","action":"share_updated","shareId":1,"before":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137229},"after":{"id":1,"name":"Library","path":"/library","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137296},"actor":"anonymous","msg":"share updated"}{"level":30,"time":1782137299767,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","effectiveFilters":{"resolvedRootPath":"/library","extensions":["mp4","mkv","avi","mov","m4v","webm","ts","m2ts","wmv"],"minSizeMb":50,"maxDepth":12},"msg":"scan starting"}{"level":30,"time":1782137300660,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":9}],"msg":"multi-share scan complete"}{"level":30,"time":1782137300661,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","filesScanned":9,"filesAdded":9,"filesUpdated":0,"filesUnchanged":0,"filesFailed":0,"filesVanished":0,"byShareCount":1,"durationMs":893,"msg":"scan complete"}{"level":30,"time":1782137300715,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/library","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}{"level":30,"time":1782137311679,"pid":7,"hostname":"5ccc3af18555","requestId":"2e5edd5f-c43a-46bd-874c-925435145665","route":"/api/queue","method":"POST","action":"enqueue","jobId":1,"fileId":6,"encoder":"libx265","msg":"job enqueued"}{"level":30,"time":1782137312303,"pid":7,"hostname":"5ccc3af18555","action":"job_transition","jobId":1,"fileId":6,"transition":"queued→encoding","encoder":"libx265","msg":"job transition: queued→encoding"}{"level":30,"time":1782137312304,"pid":7,"hostname":"5ccc3af18555","jobId":1,"encoder":"libx265","presetResolved":"slow","presetSource":"settings","msg":"dispatch_preset_resolved"}{"level":30,"time":1782137312309,"pid":7,"hostname":"5ccc3af18555","jobId":1,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/mnt/cache/x265-butler/work/1/input","statfs_ok":true},{"path":"/mnt/cache/x265-butler/work/1/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/library/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}],"msg":"preflight_statfs_probe"}{"level":30,"time":1782137321223,"pid":7,"hostname":"5ccc3af18555","action":"crop_detect","inputPath":"/library/IMG_5450.MOV","durationMs":8913,"result":"3840:2160:0:0","msg":"cropdetect pre-pass complete"}{"level":30,"time":1782137405958,"pid":7,"hostname":"5ccc3af18555","event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0,"msg":"diagnostics.page.opened"}{"level":30,"time":1782137406149,"pid":7,"hostname":"5ccc3af18555","event":"copyReportGated","source":"diagnostics-client","msg":"diagnostics.log-event"}{"level":30,"time":1782137572324,"pid":7,"hostname":"5ccc3af18555","event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0,"msg":"diagnostics.page.opened"}{"level":30,"time":1782137572388,"pid":7,"hostname":"5ccc3af18555","requestId":"13cb3c2b-fff1-4963-afc2-b32a0260b3d8","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"1","droppedLineCount":0,"lastReadOffset":3965,"requestId":"13cb3c2b-fff1-4963-afc2-b32a0260b3d8","msg":"log SSE stream closed"}{"level":30,"time":1782137572418,"pid":7,"hostname":"5ccc3af18555","event":"copyReportGated","source":"diagnostics-client","msg":"diagnostics.log-event"}{"level":30,"time":1782137575706,"pid":7,"hostname":"5ccc3af18555","encoder":"libx265","durationMs":6,"outcome":"failed","exitCode":null,"msg":"testEncodeTriggered"}{"level":30,"time":1782137575729,"pid":7,"hostname":"5ccc3af18555","event":"copyReportUnlocked","source":"diagnostics-client","outcome":"killed_timeout","encoderPicked":"libx265","msg":"diagnostics.log-event"} Hi, thanks a lot for the detailed report and logs, they were exactly what I needed.I think I've found the cause. Your log shows the x265 encoder trying to create a thread pool with 21914 threads on your 128-core host. That's bad auto-detection on machines with very high core counts (and/or multiple NUMA nodes): x265 over-allocates the thread pool, gets stuck spawning threads, and never actually starts encoding — which is exactly why the CPU sits idle, the queue shows no progress, and the Test Encode times out. It's not the black-bars/auto-crop setting (that part worked correctly and found no bars on your footage), and it's not specific to a version — every image fails because the app never capped x265's threads.The fix: I'll set an explicit x265 thread-pool cap so it can't over-allocate, with an override (X265_POOLS) in case you want to tune it.If you don't mind, two quick things to confirm the diagnosis while I prepare the fix:1. The output of "lscpu" on your server (so I can see the CPU/NUMA layout).2. Does a manual encode complete if you cap the pool? For example:ffmpeg -i input.mov -c:v libx265 -x265-params pools=8 -an -t 30 -f null -If that runs (instead of hanging), it confirms the thread-pool theory.I'll post back when the fixed image is up. Thanks again for helping track this down!
June 22Jun 22 Hi, thanks a lot for the detailed report and logs, they were exactly what I needed.I think I've found the cause. Your log shows the x265 encoder trying to create a thread pool with 21914 threads on your 128-core host. That's bad auto-detection on machines with very high core counts (and/or multiple NUMA nodes): x265 over-allocates the thread pool, gets stuck spawning threads, and never actually starts encoding — which is exactly why the CPU sits idle, the queue shows no progress, and the Test Encode times out. It's not the black-bars/auto-crop setting (that part worked correctly and found no bars on your footage), and it's not specific to a version — every image fails because the app never capped x265's threads.The fix: I'll set an explicit x265 thread-pool cap so it can't over-allocate, with an override (X265_POOLS) in case you want to tune it.If you don't mind, two quick things to confirm the diagnosis while I prepare the fix:1. The output of "lscpu" on your server (so I can see the CPU/NUMA layout).2. Does a manual encode complete if you cap the pool? For example:ffmpeg -i input.mov -c:v libx265 -x265-params pools=8 -an -t 30 -f null -If that runs (instead of hanging), it confirms the thread-pool theory.I'll post back when the fixed image is up. Thanks again for helping track this down!Seems to be it, here are the logs.lscpuArchitecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Address sizes: 43 bits physical, 48 bits virtual Byte Order: Little EndianCPU(s): 128 On-line CPU(s) list: 0-127Vendor ID: AuthenticAMD Model name: AMD Ryzen Threadripper 3990X 64-Core Processor CPU family: 23 Model: 49 Thread(s) per core: 2 Core(s) per socket: 64 Socket(s): 1 Stepping: 0 Frequency boost: disabled CPU(s) scaling MHz: 20% CPU max MHz: 4376.0000 CPU min MHz: 550.0000 BogoMIPS: 5789.12 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxex t fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid aperfmperf rapl pni p clmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic c r8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_l lc mwaitx cat_l3 cdp_l3 hw_pstate ssbd mba ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr rdpru wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilte r pfthreshold avic v_vmsave_vmload vgif v_spec_ctrl umip rdpid overflow_recov succor smca sev sev_esVirtualization features: Virtualization: AMD-VCaches (sum of all): L1d: 2 MiB (64 instances) L1i: 2 MiB (64 instances) L2: 32 MiB (64 instances) L3: 256 MiB (16 instances)NUMA: NUMA node(s): 1 NUMA node0 CPU(s): 0-127Vulnerabilities: Gather data sampling: Not affected Indirect target selection: Not affected Itlb multihit: Not affected L1tf: Not affected Mds: Not affected Meltdown: Not affected Mmio stale data: Not affected Reg file data sampling: Not affected Retbleed: Mitigation; untrained return thunk; SMT enabled with STIBP protection Spec rstack overflow: Mitigation; Safe RET Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization Spectre v2: Mitigation; Retpolines; IBPB conditional; STIBP always-on; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected Srbds: Not affected Tsa: Not affected Tsx async abort: Not affected Vmscape: Mitigation; IBPB before exit to userspaceManual ffmpegffmpeg version N-125095-g364d309af8-20260618 Copyright (c) 2000-2026 the FFmpeg developers built with gcc 15.2.0 (crosstool-NG 1.28.0.23_185f348) configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618 libavutil 60. 33.101 / 60. 33.101 libavcodec 62. 36.101 / 62. 36.101 libavformat 62. 19.101 / 62. 19.101 libavdevice 62. 4.100 / 62. 4.100 libavfilter 11. 17.100 / 11. 17.100 libswscale 9. 8.100 / 9. 8.100 libswresample 6. 4.100 / 6. 4.100Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/media/IMG_5450.MOV': Metadata: major_brand : qt minor_version : 0 compatible_brands: qt creation_time : 2026-06-16T18:07:40.000000Z com.apple.quicktime.location.accuracy.horizontal: 14.414267 com.apple.quicktime.full-frame-rate-playback-intent: 0 com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/ com.apple.quicktime.make: Apple com.apple.quicktime.model: iPhone 15 Pro com.apple.quicktime.software: 26.5 com.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200 Duration: 00:17:45.81, start: 0.000000, bitrate: 64891 kb/s Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 64440 kb/s, 59.96 fps, 59.94 tbr, 600 tbn (default) Metadata: creation_time : 2026-06-16T18:07:40.000000Z handler_name : Core Media Video vendor_id : [0][0][0][0] encoder : HEVC Side data: DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 0 Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000 Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 198 kb/s (default) Metadata: creation_time : 2026-06-16T18:07:40.000000Z handler_name : Core Media Audio vendor_id : [0][0][0][0] Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default) Metadata: creation_time : 2026-06-16T18:07:40.000000Z handler_name : Core Media Metadata Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 59 kb/s (default) Metadata: creation_time : 2026-06-16T18:07:40.000000Z handler_name : Core Media Metadata Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 156 kb/s (default) Metadata: creation_time : 2026-06-16T18:07:40.000000Z handler_name : Core Media Metadata Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default) Metadata: creation_time : 2026-06-16T18:07:40.000000Z handler_name : Core Media Metadata Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D) (default) Metadata: creation_time : 2026-06-16T18:07:40.000000Z handler_name : Core Media MetadataStream mapping: Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))Press [q] to stop, [?] for helpx265 [info]: HEVC encoder version 4.2+5-7b3d1f51x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bitx265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2x265 [info]: Main 10 profile, Level-5.1 (Main tier)x265 [info]: Thread pool created using 8 threadsx265 [info]: Slices : 1x265 [info]: frame threads / pool features : 3 / wpp(34 rows)x265 [info]: Coding QT: max CU size, min CU size : 64 / 8x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intrax265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3x265 [info]: Keyframe min / max / scenecut / bias : 25 / 250 / 40 / 5.00 x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0x265 [info]: References / ref-limit cu / depth : 3 / off / onx265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1x265 [info]: Rate Control / qCompress : CRF-28.0 / 0.60x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip mode=1 signhide tmvpx265 [info]: tools: b-intra strong-intra-smoothing lslices=8 deblock saox265 [info]: tools: dhdr10-infoOutput #0, null, to 'pipe:': Metadata: major_brand : qt minor_version : 0 compatible_brands: qt com.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200 com.apple.quicktime.location.accuracy.horizontal: 14.414267 com.apple.quicktime.full-frame-rate-playback-intent: 0 com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/ com.apple.quicktime.make: Apple com.apple.quicktime.model: iPhone 15 Pro com.apple.quicktime.software: 26.5 encoder : Lavf62.19.101 Stream #0:0(und): Video: hevc, yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67, progressive), 3840x2160, q=2-31, 59.94 fps, 59.94 tbn (default) Metadata: encoder : Lavc62.36.101 libx265 creation_time : 2026-06-16T18:07:40.000000Z handler_name : Core Media Video vendor_id : [0][0][0][0] Side data: Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000 CPB properties: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A[out#0/null @ 0x56002b6e8fc0] video:11069KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknownframe= 1799 fps=6.9 q=37.7 Lsize=N/A time=00:00:29.97 bitrate=N/A speed=0.114x elapsed=0:04:22.07 x265 [info]: frame I: 8, Avg QP:30.45 kb/s: 27036.98x265 [info]: frame P: 430, Avg QP:31.83 kb/s: 8125.31 x265 [info]: frame B: 1361, Avg QP:37.08 kb/s: 1258.02 x265 [info]: Weighted P-Frames: Y:0.5% UV:0.2%encoded 1799 frames in 261.67s (6.88 fps), 3014.09 kb/s, Avg QP:35.79Watching my cores on the dashboard page, it is definitely working. Not much (5 to 8%), but working...I know it does not come from the crop option, but I'm almost sure it was working days ago... Or maybe I dreamt it :)If you set a cap, will it still be able to use all the available cores ?
June 22Jun 22 Author 11 minutes ago, tbal82 said:Seems to be it, here are the logs.lscpuArchitecture: x86_64CPU op-mode(s): 32-bit, 64-bitAddress sizes: 43 bits physical, 48 bits virtualByte Order: Little EndianCPU(s): 128On-line CPU(s) list: 0-127Vendor ID: AuthenticAMDModel name: AMD Ryzen Threadripper 3990X 64-Core ProcessorCPU family: 23Model: 49Thread(s) per core: 2Core(s) per socket: 64Socket(s): 1Stepping: 0Frequency boost: disabledCPU(s) scaling MHz: 20%CPU max MHz: 4376.0000CPU min MHz: 550.0000BogoMIPS: 5789.12Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid aperfmperf rapl pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cat_l3 cdp_l3 hw_pstate ssbd mba ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smapclflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperfxsaveerptr rdpru wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif v_spec_ctrl umip rdpid overflow_recov succor smca sev sev_esVirtualization features:Virtualization: AMD-VCaches (sum of all):L1d: 2 MiB (64 instances)L1i: 2 MiB (64 instances)L2: 32 MiB (64 instances)L3: 256 MiB (16 instances)NUMA:NUMA node(s): 1NUMA node0 CPU(s): 0-127Vulnerabilities:Gather data sampling: Not affectedIndirect target selection: Not affectedItlb multihit: Not affectedL1tf: Not affectedMds: Not affectedMeltdown: Not affectedMmio stale data: Not affectedReg file data sampling: Not affectedRetbleed: Mitigation; untrained return thunk; SMT enabled with STIBP protectionSpec rstack overflow: Mitigation; Safe RETSpec store bypass: Mitigation; Speculative Store Bypass disabled via prctlSpectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitizationSpectre v2: Mitigation; Retpolines; IBPB conditional; STIBP always-on; RSB filling; PBRSB-eIBRS Not affected; BHI Not affectedSrbds: Not affectedTsa: Not affectedTsx async abort: Not affectedVmscape: Mitigation; IBPB before exit to userspaceManual ffmpegffmpeg version N-125095-g364d309af8-20260618 Copyright (c) 2000-2026 the FFmpeg developersbuilt with gcc 15.2.0 (crosstool-NG 1.28.0.23_185f348)configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618libavutil 60. 33.101 / 60. 33.101libavcodec 62. 36.101 / 62. 36.101libavformat 62. 19.101 / 62. 19.101libavdevice 62. 4.100 / 62. 4.100libavfilter 11. 17.100 / 11. 17.100libswscale 9. 8.100 / 9. 8.100libswresample 6. 4.100 / 6. 4.100Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/media/IMG_5450.MOV':Metadata:major_brand : qtminor_version : 0compatible_brands: qtcreation_time : 2026-06-16T18:07:40.000000Zcom.apple.quicktime.location.accuracy.horizontal: 14.414267com.apple.quicktime.full-frame-rate-playback-intent: 0com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/com.apple.quicktime.make: Applecom.apple.quicktime.model: iPhone 15 Procom.apple.quicktime.software: 26.5com.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200Duration: 00:17:45.81, start: 0.000000, bitrate: 64891 kb/sStream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 64440 kb/s, 59.96 fps, 59.94 tbr, 600 tbn (default)Metadata:creation_time : 2026-06-16T18:07:40.000000Zhandler_name : Core Media Videovendor_id : [0][0][0][0]encoder : HEVCSide data:DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 0Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 198 kb/s (default)Metadata:creation_time : 2026-06-16T18:07:40.000000Zhandler_name : Core Media Audiovendor_id : [0][0][0][0]Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)Metadata:creation_time : 2026-06-16T18:07:40.000000Zhandler_name : Core Media MetadataStream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 59 kb/s (default)Metadata:creation_time : 2026-06-16T18:07:40.000000Zhandler_name : Core Media MetadataStream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 156 kb/s (default)Metadata:creation_time : 2026-06-16T18:07:40.000000Zhandler_name : Core Media MetadataStream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)Metadata:creation_time : 2026-06-16T18:07:40.000000Zhandler_name : Core Media MetadataStream #0:6[0x7](und): Data: none (mebx / 0x7862656D) (default)Metadata:creation_time : 2026-06-16T18:07:40.000000Zhandler_name : Core Media MetadataStream mapping:Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))Press [q] to stop, [?] for helpx265 [info]: HEVC encoder version 4.2+5-7b3d1f51x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bitx265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2x265 [info]: Main 10 profile, Level-5.1 (Main tier)x265 [info]: Thread pool created using 8 threadsx265 [info]: Slices : 1x265 [info]: frame threads / pool features : 3 / wpp(34 rows)x265 [info]: Coding QT: max CU size, min CU size : 64 / 8x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intrax265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3x265 [info]: Keyframe min / max / scenecut / bias : 25 / 250 / 40 / 5.00x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0x265 [info]: References / ref-limit cu / depth : 3 / off / onx265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1x265 [info]: Rate Control / qCompress : CRF-28.0 / 0.60x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip mode=1 signhide tmvpx265 [info]: tools: b-intra strong-intra-smoothing lslices=8 deblock saox265 [info]: tools: dhdr10-infoOutput #0, null, to 'pipe:':Metadata:major_brand : qtminor_version : 0compatible_brands: qtcom.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200com.apple.quicktime.location.accuracy.horizontal: 14.414267com.apple.quicktime.full-frame-rate-playback-intent: 0com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/com.apple.quicktime.make: Applecom.apple.quicktime.model: iPhone 15 Procom.apple.quicktime.software: 26.5encoder : Lavf62.19.101Stream #0:0(und): Video: hevc, yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67, progressive), 3840x2160, q=2-31, 59.94 fps, 59.94 tbn (default)Metadata:encoder : Lavc62.36.101 libx265creation_time : 2026-06-16T18:07:40.000000Zhandler_name : Core Media Videovendor_id : [0][0][0][0]Side data:Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000CPB properties: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A[out#0/null @ 0x56002b6e8fc0] video:11069KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknownframe= 1799 fps=6.9 q=37.7 Lsize=N/A time=00:00:29.97 bitrate=N/A speed=0.114x elapsed=0:04:22.07x265 [info]: frame I: 8, Avg QP:30.45 kb/s: 27036.98x265 [info]: frame P: 430, Avg QP:31.83 kb/s: 8125.31x265 [info]: frame B: 1361, Avg QP:37.08 kb/s: 1258.02x265 [info]: Weighted P-Frames: Y:0.5% UV:0.2%encoded 1799 frames in 261.67s (6.88 fps), 3014.09 kb/s, Avg QP:35.79Watching my cores on the dashboard page, it is definitely working. Not much (5 to 8%), but working...I know it does not come from the crop option, but I'm almost sure it was working days ago... Or maybe I dreamt it :)If you set a cap, will it still be able to use all the available cores ?Great, that confirms it, thanks for running the manual test.Short answer: no, the cap does not use all 128 threads, and that's deliberate, not a limitation.Here's the reasoning:- For a single x265 encode, throughput stops scaling well past ~16 threads. A 4K HEVC encode only exposes so much parallelism (wavefront ≈ 34 rows, 3 frame-threads in your log), so threads 17–128 mostly sit idle waiting on each other anyway. The 21914 threads your box tried to spawn wasn't "using all cores" — it was the auto-detect over-allocating on a 64-core/128-thread CPU, getting stuck spawning threads, and never starting the encode. That's the hang we're fixing.- So the fix defaults the pool to min(cores, 16) = 16 on your machine. Your pools=8 manual test (8 threads, encode completed) already proved the pool just needs to be bounded.- The 5–8% CPU you see is expected for one encode on a 128-thread box, that's roughly 10 cores busy. The encode being slow (0.114x in your test) is just 4K 60fps 10-bit HEVC being heavy; the thread cap is not what makes it slow.If you want more cores working, two levers:1. X265_POOLS=32 (or 64), raises the per-encode pool. It's uncapped above 16, so you can tune it. Expect diminishing returns, and don't go silly-high or you risk the same over-allocationstall.2. Better on a 64-core box: raise the app's concurrency so it encodes several files at once. One encode won't saturate your CPU no matter the pool size; running 4–8 in parallel will. That'sthe real way to put those cores to work.The "it worked days ago" isn't you dreaming, if those encodes used the NVIDIA/Intel hardware path, or were shorter/smaller clips, they'd dodge the x265 thread-pool path entirely.Fixed image is on the way, it ships the 16-thread default plus the X265_POOLS override so you can tune it without waiting on me.
June 22Jun 22 Author 🚀 v2.34.0 - Encode-stall fix on high-core-count hosts + auto-crop clarity is liveghcr.io/masterjb/x265-butler:2.34.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.Pull / upgrade:docker pull ghcr.io/masterjb/x265-butler:latestdocker restart x265-butlerThis fixes libx265 encodes that hung forever on machines with very many CPU threads (the report: a 128-thread host) - x265's own thread-pool auto-detect over-allocated and stalled before the first frame. v2.34.0 caps the pool to a sane bound so the encode actually runs.🔧 WHAT CHANGED• libx265 thread-pool cap (the stall fix): we now pass pools=min(cpuCount, 16) to x265, bypassing the NUMA auto-detect that logged "Thread pool created using 21914 threads" on a 128-CPU box and then hung. The cap covers normal encodes, the Test Encode, and the boot detection-probe. Override with X265_POOLS=8 to pin an exact size, or X265_POOLS=0 (or "auto") to fall back to x265 native auto-detect. libx265 only - NVENC/QSV/VAAPI are unaffected (no CPU thread pool).• Auto-crop no-op is now visible: when Auto-Crop is on and the source has NO black bars, the file is encoded full-frame (correct, unchanged). That used to be silent, so it looked broken. Now it logs a clear line and the Settings + onboarding text says a bars-free file is left unchanged on purpose - that is the expected result, not an error.🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:Extra Parameters:--runtime=nvidiaVariables:NVIDIA_VISIBLE_DEVICES = allNVIDIA_DRIVER_CAPABILITIES = compute,video,utilityThe "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.♻️ ROLLBACKIf v2.34.0 misbehaves on your hardware, roll back to the previous image:docker stop x265-butler && docker rm x265-butlerdocker pull ghcr.io/masterjb/x265-butler:2.33.0🔭 COMING NEXTRolling bug-stabilization continues - keep the diagnostics reports coming, they drive these fixes. Edited June 22Jun 22 by Human-126094 fix spelling
June 23Jun 23 So - every thing works fine now from my side.Thanks for this nice work.Just one thing...The system is very sluggish when encoding is in progress.The pages take a very long time to load, and sometimes the loading process even crashes (though in that case, I had three encodes running simultaneously).But the encodes are still running in the background.
June 23Jun 23 Author On 6/15/2026 at 5:24 PM, ASimpleSomething said:Okay i got encoding to work i was having issues with my cache settings. But now after i restart the docker after a fresh install its super laggy on the interface and i loose my amd card. Any ideas as to why?Hi @ASimpleSomething thanks for the report, and glad encoding is working now!I'd like to fix the "lose my AMD card after restart" issue properly, but I need a bit of data from your setup to target it instead of guessing. When you get a chance, could you grab the following right after a restart where the AMD card has gone missing?1) Diagnostics pageOpen the app's /diagnostics page and take a screenshot (or copy the text). I'm specifically looking at the VAAPI / render-device section, does it say the encoder is "broken" or "missing", and is there any driver / render-node warning shown?2) Container log around startupFrom the Docker logs, please copy the lines from right after the restart.The two I care about most are: - "encoder loop started" - "encoder detection complete"The "detection complete" line lists the detected encoders, the outcome per encoder, and a short error excerpt if a probe failed, that excerpt is the key piece.3) Was anything encoding at the moment you restarted?Were there jobs running or queued when you restarted the container? (yes/no, roughly how many)4) Does a second restart bring it back?If you restart again with the queue paused or empty, does the AMD card show up correctly? (yes/no)5) GPU passthroughHow is the GPU passed into the container, which /dev/dri device(s), and your --device / PGID settings? Just want to rule out the device dropping out at the Docker level vs. the app mis-detecting it.My current suspicion: at boot the app probes the GPU and starts encoding at the Same time, so a real encode can grab the AMD card's encode session before the probe finishes, the probe then fails, the card gets marked unavailable, and it stays that way until the next restart. The data above will confirm whether that's what's happening before I ship the fix.Thanks a lot, this will let me fix it precisely rather than blind.
June 23Jun 23 Author 2 hours ago, cmeyer86 said:So - every thing works fine now from my side.Thanks for this nice work.Just one thing...The system is very sluggish when encoding is in progress.The pages take a very long time to load, and sometimes the loading process even crashes (though in that case, I had three encodes running simultaneously).But the encodes are still running in the background.Great to hear it's all working for you now, thanks for the kind words! 🙏You've actually spotted something that's already on my radar. The sluggish page loads (and the occasional crash) during active encodes come from the encoder processes competing with the web server for CPU, especially noticeable with three encodes running at once.Good news: the encodes themselves keep running in the background regardless, so no work is ever lost. And a fix to keep the UI responsive while encoding is already in planning. The goal is to make sure the web interface stays snappy no matter how many encodes are in flight.I'll post here once it ships. Thanks again for the detailed report, that's exactly the kind of feedback that helps! 👍
June 23Jun 23 Author 🚀 v2.35.0 - Web UI stays responsive while encoding is liveghcr.io/masterjb/x265-butler:2.35.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.Pull / upgrade:docker pull ghcr.io/masterjb/x265-butler:latestdocker restart x265-butlerIf the UI got sluggish while encoding, pages slow to load, or the page-load "crashing" when a couple of encodes ran at once, this is the fix. ffmpeg used to run at the same priority as the web server and starved it on a busy CPU. Now every ffmpeg child is renice'd to the lowest priority, so the UI always wins the scheduler. Encodes still use the full CPU when the UI is idle, so encode speed is unchanged.• Tune it with ENCODE_NICE (default 19). ENCODE_NICE=0 = the old behavior (revert lever).• Bonus: slow request-path DB queries now show up in the /diagnostics copy-report (were silently dropped before). Tune the threshold with SLOW_QUERY_MS (default 100ms).No new dependencies, no migrations, encode output byte-identical to v2.34.x.🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:Extra Parameters:--runtime=nvidiaVariables:NVIDIA_VISIBLE_DEVICES = allNVIDIA_DRIVER_CAPABILITIES = compute,video,utilityThe "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.♻️ ROLLBACKIf v2.35.0 misbehaves on your hardware, roll back to the previous image:docker stop x265-butler && docker rm x265-butlerdocker pull ghcr.io/masterjb/x265-butler:2.34.0Or just set ENCODE_NICE=0 to turn off the renice without rolling back.🔭 COMING NEXT• Detection robustness on restart - an AMD/VAAPI card that can go missing after a fresh-install restart (a boot-timing race against the first encode). Looking into a re-detect path so the card comes back without a manual restart.Plans can change, but that's the next thing on the bench.
June 23Jun 23 Hi, v2.35.0 improves ffmpeg scheduling correctly, but the Web UI is still very sluggish for me during two concurrent QSV encodes.What works:- x265-butler 2.35.0- qsv detected and functional- last test encode uses hevc_qsv successfully- active encode commands use -c:v hevc_qsv- ffmpeg processes are correctly reniced to NI 19- no DRI permission issues- no slow queries/requests in diagnosticsObserved during two active QSV encodes:next-server NI 0 CPU ~102%ffmpeg NI 19 CPU ~67% -c:v hevc_qsvffmpeg NI 19 CPU ~68% -c:v hevc_qsvThe UI is sluggish even though ffmpeg is already at nice 19. Closing the browser tab does not noticeably reduce next-server CPU usage. This looks like the remaining bottleneck is inside the single-process Next.js server, possibly queue/progress/SSE/SQLite/job-state handling. Edited June 23Jun 23 by cmeyer86 switched from quote to inline code
June 23Jun 23 🚀 v2.34.0 - Encode-stall fix on high-core-count hosts + auto-crop clarity is liveghcr.io/masterjb/x265-butler:2.34.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.Pull / upgrade:docker pull ghcr.io/masterjb/x265-butler:latestdocker restart x265-butlerThis fixes libx265 encodes that hung forever on machines with very many CPU threads (the report: a 128-thread host) - x265's own thread-pool auto-detect over-allocated and stalled before the first frame. v2.34.0 caps the pool to a sane bound so the encode actually runs.🔧 WHAT CHANGED• libx265 thread-pool cap (the stall fix): we now pass pools=min(cpuCount, 16) to x265, bypassing the NUMA auto-detect that logged "Thread pool created using 21914 threads" on a 128-CPU box and then hung. The cap covers normal encodes, the Test Encode, and the boot detection-probe. Override with X265_POOLS=8 to pin an exact size, or X265_POOLS=0 (or "auto") to fall back to x265 native auto-detect. libx265 only - NVENC/QSV/VAAPI are unaffected (no CPU thread pool).• Auto-crop no-op is now visible: when Auto-Crop is on and the source has NO black bars, the file is encoded full-frame (correct, unchanged). That used to be silent, so it looked broken. Now it logs a clear line and the Settings + onboarding text says a bars-free file is left unchanged on purpose - that is the expected result, not an error.🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:Extra Parameters:--runtime=nvidiaVariables:NVIDIA_VISIBLE_DEVICES = allNVIDIA_DRIVER_CAPABILITIES = compute,video,utilityThe "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.♻️ ROLLBACKIf v2.34.0 misbehaves on your hardware, roll back to the previous image:docker stop x265-butler && docker rm x265-butlerdocker pull ghcr.io/masterjb/x265-butler:2.33.0🔭 COMING NEXTRolling bug-stabilization continues - keep the diagnostics reports coming, they drive these fixes.Hi,Again : huge work, thanks a lot !I've been trying 4 times since yesterday but it never finishes...I have tried with both big and small files, it seems to always fail close to the end.Here are the logs of a small file :FileSkip to main contentx265-butler2.35.0 Dashboard Stats Bench Storage Library Queue Trash Blocklist Estimate Settings Diagnostics LogsLogsIMG_5453.MOVStatic98 lines19ef54582cb Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/cache/work/9/input':19ef54582cb Metadata:19ef54582cb major_brand : qt 19ef54582cb minor_version : 019ef54582cb compatible_brands: qt 19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb com.apple.quicktime.location.accuracy.horizontal: 19.97070619ef54582cb com.apple.quicktime.full-frame-rate-playback-intent: 019ef54582cb com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.292/19ef54582cb com.apple.quicktime.make: Apple19ef54582cb com.apple.quicktime.model: iPhone 15 Pro19ef54582cb com.apple.quicktime.software: 26.519ef54582cb com.apple.quicktime.creationdate: 2026-06-16T20:47:31+020019ef54582cb Duration: 00:04:34.77, start: 0.000000, bitrate: 80563 kb/s19ef54582cb Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 79979 kb/s, 59.94 fps, 59.94 tbr, 600 tbn (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Video19ef54582cb vendor_id : [0][0][0][0]19ef54582cb encoder : HEVC19ef54582cb Side data:19ef54582cb DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 019ef54582cb Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.32900019ef54582cb Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 210 kb/s (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Audio19ef54582cb vendor_id : [0][0][0][0]19ef54582cb Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Metadata19ef54582cb Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 102 kb/s (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Metadata19ef54582cb Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 230 kb/s (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Metadata19ef54582cb Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Metadata19ef54582cb Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D), 0 kb/s (default)19ef54582cb Metadata: creation_time : 2026-06-16T18:47:31.000000Z19ef54582cc 19ef54582cc handler_name : Core Media Metadata19ef54582ce Stream mapping:19ef54582ce Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))19ef54582ce Stream #0:1 -> #0:1 (copy) Stream #0:2 -> #0:2 (copy)19ef54582ce 19ef54582cf Stream #0:3 -> #0:3 (copy)19ef54582cf Stream #0:4 -> #0:4 (copy)19ef54582cf Stream #0:5 -> #0:5 (copy)19ef54582cf Stream #0:6 -> #0:6 (copy)19ef54582cf Press [q] to stop, [?] for help19ef5458472 x265 [info]: HEVC encoder version 4.2+5-7b3d1f5119ef5458472 x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit19ef5458473 x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX219ef5458473 x265 [info]: Main 10 profile, Level-5.1 (Main tier)19ef5458473 x265 [info]: Thread pool created using 16 threads19ef5458473 x265 [info]: Slices : 119ef5458473 x265 [info]: frame threads / pool features : 4 / wpp(34 rows)19ef54584b7 x265 [info]: Coding QT: max CU size, min CU size : 64 / 819ef54584b7 x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra19ef54584b7 x265 [info]: ME / range / subpel / merge : star / 57 / 3 / 319ef54584b7 x265 [info]: Keyframe min / max / scenecut / bias : 25 / 250 / 40 / 5.00 19ef54584b7 x265 [info]: Lookahead / bframes / badapt : 25 / 4 / 219ef54584b7 x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 019ef54584b7 x265 [info]: References / ref-limit cu / depth : 4 / on / on19ef54584b7 x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 119ef54584b7 x265 [info]: Rate Control / qCompress : CRF-20.0 / 0.6019ef54584b7 x265 [info]: tools: rect limit-modes rd=4 psy-rd=2.00 rdoq=2 psy-rdoq=1.0019ef54584b7 x265 [info]: tools: rskip mode=1 signhide tmvp strong-intra-smoothing lslices=419ef54584b7 x265 [info]: tools: deblock sao dhdr10-info19ef54584b8 [matroska @ 0x55d090600900] Only audio, video, and subtitles are supported for Matroska.19ef54584b8 [out#0/matroska @ 0x55d0905ec0c0] Could not write header (incorrect codec parameters ?): Invalid argument19ef54584b8 [vf#0:0 @ 0x55d090601980] Error sending frames to consumers: Invalid argument19ef54584b8 [vf#0:0 @ 0x55d090601980] Task finished with error code: -22 (Invalid argument)19ef54584b8 [vf#0:0 @ 0x55d090601980] Terminating thread with return code -22 (Invalid argument)19ef54586fe [out#0/matroska @ 0x55d0905ec0c0] Nothing was written into output file, because at least one of its streams received no packets.19ef54586fe frame= 0 fps=0.0 q=0.0 Lsize= 0KiB time=00:04:34.77 bitrate= 0.0kbits/s speed= 256x elapsed=0:00:01.07 19ef54586ff frame=019ef54586ff fps=0.0019ef54586ff stream_0_0_q=0.019ef54586ff bitrate= 0.0kbits/s19ef54586ff total_size=019ef54586ff out_time_us=27477500019ef54586ff out_time_ms=27477500019ef54586ff out_time=00:04:34.77500019ef54586ff dup_frames=019ef54586ff drop_frames=019ef54586ff speed= 256x19ef54586ff progress=end19ef5458700 19ef5458700 encoded 0 frames19ef5458705 Conversion failed!Showing 1–9 of 9▼x265-butlerContainer2026-06-23T16:17:03.616Z INFO job enqueued {"requestId":"e5c89d39-3d1b-41be-bb8e-6d238e19cc2e","route":"/api/queue","method":"POST","action":"enqueue","jobId":9,"fileId":42,"encoder":"libx265"}2026-06-23T16:17:04.362Z INFO job transition: queued→encoding {"action":"job_transition","jobId":9,"fileId":42,"transition":"queued→encoding","encoder":"libx265"}2026-06-23T16:17:04.363Z INFO dispatch_preset_resolved {"jobId":9,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-23T16:17:04.365Z INFO preflight_statfs_probe {"jobId":9,"fileId":42,"encoder":"libx265","paths_probed":[{"path":"/cache/work/9/input","statfs_ok":true},{"path":"/cache/work/9/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5453-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-23T16:17:13.773Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5453.MOV","durationMs":9408,"result":"3840:2160:0:0"}2026-06-23T16:17:13.774Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":9,"fileId":42,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}2026-06-23T16:17:15.043Z INFO job transition: encoding→failed {"action":"job_transition","jobId":9,"fileId":42,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}2026-06-23T16:17:15.119Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-23T16:18:02.245Z INFO diagnostics.page.opened {"event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0}2026-06-23T16:18:02.360Z INFO diagnostics.log-event {"event":"copyReportGated","source":"diagnostics-client"}2026-06-23T16:18:09.514Z INFO testEncodeTriggered {"encoder":"libx265","durationMs":332,"outcome":"success","exitCode":0}2026-06-23T16:18:09.542Z INFO diagnostics.log-event {"event":"copyReportUnlocked","source":"diagnostics-client","outcome":"success","encoderPicked":"libx265"}And the logs for a large file I'm trying to convert, I have attached the file (which seems truncated, but is exactly the same in the UI...)7.logTest Encode is in success, and I have tried X265_POOLS to 16/32/64 with no success...Diagnostic Report## x265-butler diagnostics report### App- version: 2.35.0- gitHash: f944b8d2- committedAt: 1782209160- committedAtCET: 23.06.26, 12:06:00### Runtime- nodeVersion: v22.23.0- platform: linux- arch: x64- uptimeSec: 442- pid: 52### Mounts| path | readable | writable | error ||---|---|---|---|| /media | ✓ | ✓ | || /cache | ✓ | ✓ | || /config | ✓ | ✓ | |### Cache- effectivePath: /cache- resolution: user-override- settingValue: /cache- writable: ✓### Devices- DRI: /dev/dri/card0, /dev/dri/renderD128- NVIDIA: /dev/nvidia0, /dev/nvidiactl### Encoders- detected: libx265- detection warnings: - encoder_runtime_broken — nvenc: 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating thread with return code -22 (Invalid argument)- probe outcomes: - nvenc: compiled-in-broken — 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating thread with return code -22 (Invalid argument) - qsv: missing - vaapi: missing - libx265: functional### Active warnings- WARN encoder:encoder_runtime_broken — nvenc: 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating### Recent errors (in-memory, last ≤25)_no recent errors_### Onboarding- completed: ✓- hasShare: ✓## Container Image- OS: Debian GNU/Linux 13 (trixie)- GLIBC: 2.41- Intel Media Driver: — (so-symlink)- libva: 2.22.0-3- libdrm: 2.4.124-2- oneVPL MFX runtime (libmfx-gen1.2): 25.1.4-1- oneVPL dispatcher (libvpl2): 1:2.14.0-1+b1- libigfxcmrt7: 25.2.3+dfsg1-1- _(oneVPL versions report installed-package presence; runtime QSV-functionality is verified separately by the probe-encode — 23-04)_- ffmpeg version: N-125095-g364d309af8-20260618<details><summary>ffmpeg configuration flags</summary>```--prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618```</details>## CPU- Vendor: AuthenticAMD- Model name: AMD Ryzen Threadripper 3990X 64-Core Processor- CPUID family/model: 23 / 49- Microarch: —- Graphics gen: —- HEVC-QSV (hardware): unknown- _(HEVC-QSV reflects iGPU HARDWARE capability by the embedded gen-table; runtime QSV functionality is verified separately by the probe-encode — 23-04)_## Blocklist Evaluation<!-- Operator: paths below are verbatim. Redact mount/user prefixes before posting if sensitive. -->- Total entries: 0- Pattern cache: —_No recent evaluations._## Slow Requests_No slow requests recorded (threshold: 1s)._## Slow Queries_No slow queries recorded (threshold: 100ms)._## Web Vitals_No web vitals recorded._## DRI Render Devices| Device | GID | Group | In group | R | W | Error ||---|---|---|---|---|---|---|| /dev/dri/renderD128 | 18 | — | ✗ | ✓ | ✓ | |_Group name is container-side and informational; the numeric GID is authoritative. No render device reported an access failure that group membership would resolve — PGID / --group-add changes are not required._### Last test-encode (client UAT run)- outcome: success- encoderPicked: libx265- durationMs: 265- exitCode: 0stderr:```Input #0, lavfi, from 'testsrc=size=320x240:rate=1:duration=5': Duration: N/A, start: 0.000000, bitrate: N/A Stream #0:0: Video: wrapped_avframe, rgb24, 320x240 [SAR 1:1 DAR 4:3], 1 fps, 1 tbr, 1 tbnStream mapping: Stream #0:0 -> #0:0 (wrapped_avframe (native) -> hevc (libx265))Press [q] to stop, [?] for helpx265 [info]: HEVC encoder version 4.2+5-7b3d1f51x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 8bit+10bit+12bitx265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2x265 [warning]: halving the quality when psy-rd is enabled for 444 input. Setting cbQpOffset = 6 and crQpOffset = 6x265 [info]: Main 4:4:4 profile, Level-2 (Main tier)x265 [info]: Thread pool created using 16 threadsx265 [info]: Slices : 1x265 [info]: frame threads / pool features : 4 / wpp(4 rows)x265 [warning]: Source height < 720p; disabling lookahead-slicesx265 [info]: Coding QT: max CU size, min CU size : 64 / 8x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intrax265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3x265 [info]: Keyframe min / max / scenecut / bias : 1 / 250 / 40 / 5.00 x265 [info]: Cb/Cr QP Offset : 6 / 6x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0x265 [info]: References / ref-limit cu / depth : 3 / off / onx265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1x265 [info]: Rate Control / qCompress : CRF-28.0 / 0.60x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip mode=1 signhide tmvpx265 [info]: tools: b-intra strong-intra-smoothing deblock saoOutput #0, null, to '/dev/null': Metadata: encoder : Lavf62.19.101 Stream #0:0: Video: hevc, gbrp(pc, gbr/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], q=2-31, 1 fps, 1 tbn Metadata: encoder : Lavc62.36.101 libx265 Side data: CPB properties: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A[out#0/null @ 0x55b818757f40] video:10KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknownframe= 5 fps=0.0 q=25.8 Lsize=N/A time=00:00:03.00 bitrate=N/A speed=15.3x elapsed=0:00:00.19 x265 [info]: frame I: 1, Avg QP:20.35 kb/s: 30.37 x265 [info]: frame P: 2, Avg QP:22.61 kb/s: 10.22 x265 [info]: frame B: 2, Avg QP:25.89 kb/s: 6.65 x265 [info]: Weighted P-Frames: Y:0.0% UV:0.0%encoded 5 frames in 0.14s (35.74 fps), 12.82 kb/s, Avg QP:23.47```_Generated 2026-06-23T16:21:17.419Z_
June 23Jun 23 Author 9 hours ago, cmeyer86 said:Hi, v2.35.0 improves ffmpeg scheduling correctly, but the Web UI is still very sluggish for me during two concurrent QSV encodes.What works:- x265-butler 2.35.0- qsv detected and functional- last test encode uses hevc_qsv successfully- active encode commands use -c:v hevc_qsv- ffmpeg processes are correctly reniced to NI 19- no DRI permission issues- no slow queries/requests in diagnosticsObserved during two active QSV encodes:The UI is sluggish even though ffmpeg is already at nice 19. Closing the browser tab does not noticeably reduce next-server CPU usage. This looks like the remaining bottleneck is inside the single-process Next.js server, possibly queue/progress/SSE/SQLite/job-state handling.Thanks, that's a clean report and rules out the obvious suspects (renice, DRI permissions, slow queries). With both ffmpeg children already at nice 19 and next-server pinned near 100%, the bottleneck is inside the Node process itself, not the encodes. To find which loop is burning the CPU I need a few data points captured DURING the two active QSV encodes.1. Per-thread CPU of next-server (which thread is hot, main loop vs libuv pool): ps -eLo pid,tid,ni,pcpu,comm | grep -i next-server | sort -k4 -nr | head -202. Run with debug logging for ~60s during the two encodes and attach the output: docker exec <container> sh -c 'LOG_LEVEL=debug' is build-baked, so instead set LOG_LEVEL=debug in the container env and restart, then capture: docker logs --since 60s <container> > x265-debug.log3. How many concurrent SSE/progress clients are open? Please test with ALL browser tabs to the UI fully closed (not just backgrounded) for 60s and report whether next-server CPU drops. "Closing the tab doesn't help" suggests the work is server-side and tab-independent — confirming that narrows it to the encode progress/poll path, not SSE fan-out.4. Library size, rough row counts help me judge if a query/scan loop scales with DB size: - number of files in library - number of active + queued jobs5. Progress granularity: are the two encodes 4K/long sources? Frequent ffmpeg progress lines (per-frame) parsed + persisted per encode can dominate. Knowing source resolution/fps + how often the queue/progress UI updates helps.What I suspect: the per-encode ffmpeg progress parser + per-update SQLite write, multiplied by 2 concurrent encodes, running hotter than expected, or a UI poll endpoint doing more work per request than it should.
June 23Jun 23 Author 4 hours ago, tbal82 said:Hi,Again : huge work, thanks a lot !I've been trying 4 times since yesterday but it never finishes...I have tried with both big and small files, it seems to always fail close to the end.Here are the logs of a small file :FileSkip to main contentx265-butler2.35.0DashboardStatsBenchStorageLibraryQueueTrashBlocklistEstimateSettingsDiagnosticsLogsLogsIMG_5453.MOVStatic98 lines19ef54582cb Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/cache/work/9/input':19ef54582cb Metadata:19ef54582cb major_brand : qt19ef54582cb minor_version : 019ef54582cb compatible_brands: qt19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb com.apple.quicktime.location.accuracy.horizontal: 19.97070619ef54582cb com.apple.quicktime.full-frame-rate-playback-intent: 019ef54582cb com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.292/19ef54582cb com.apple.quicktime.make: Apple19ef54582cb com.apple.quicktime.model: iPhone 15 Pro19ef54582cb com.apple.quicktime.software: 26.519ef54582cb com.apple.quicktime.creationdate: 2026-06-16T20:47:31+020019ef54582cb Duration: 00:04:34.77, start: 0.000000, bitrate: 80563 kb/s19ef54582cb Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 79979 kb/s, 59.94 fps, 59.94 tbr, 600 tbn (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Video19ef54582cb vendor_id : [0][0][0][0]19ef54582cb encoder : HEVC19ef54582cb Side data:19ef54582cb DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 019ef54582cb Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.32900019ef54582cb Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 210 kb/s (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Audio19ef54582cb vendor_id : [0][0][0][0]19ef54582cb Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Metadata19ef54582cb Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 102 kb/s (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Metadata19ef54582cb Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 230 kb/s (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Metadata19ef54582cb Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)19ef54582cb Metadata:19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z19ef54582cb handler_name : Core Media Metadata19ef54582cb Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D), 0 kb/s (default)19ef54582cb Metadata:creation_time : 2026-06-16T18:47:31.000000Z19ef54582cc19ef54582cc handler_name : Core Media Metadata19ef54582ce Stream mapping:19ef54582ce Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))19ef54582ce Stream #0:1 -> #0:1 (copy)Stream #0:2 -> #0:2 (copy)19ef54582ce19ef54582cf Stream #0:3 -> #0:3 (copy)19ef54582cf Stream #0:4 -> #0:4 (copy)19ef54582cf Stream #0:5 -> #0:5 (copy)19ef54582cf Stream #0:6 -> #0:6 (copy)19ef54582cf Press [q] to stop, [?] for help19ef5458472 x265 [info]: HEVC encoder version 4.2+5-7b3d1f5119ef5458472 x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit19ef5458473 x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX219ef5458473 x265 [info]: Main 10 profile, Level-5.1 (Main tier)19ef5458473 x265 [info]: Thread pool created using 16 threads19ef5458473 x265 [info]: Slices : 119ef5458473 x265 [info]: frame threads / pool features : 4 / wpp(34 rows)19ef54584b7 x265 [info]: Coding QT: max CU size, min CU size : 64 / 819ef54584b7 x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra19ef54584b7 x265 [info]: ME / range / subpel / merge : star / 57 / 3 / 319ef54584b7 x265 [info]: Keyframe min / max / scenecut / bias : 25 / 250 / 40 / 5.0019ef54584b7 x265 [info]: Lookahead / bframes / badapt : 25 / 4 / 219ef54584b7 x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 019ef54584b7 x265 [info]: References / ref-limit cu / depth : 4 / on / on19ef54584b7 x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 119ef54584b7 x265 [info]: Rate Control / qCompress : CRF-20.0 / 0.6019ef54584b7 x265 [info]: tools: rect limit-modes rd=4 psy-rd=2.00 rdoq=2 psy-rdoq=1.0019ef54584b7 x265 [info]: tools: rskip mode=1 signhide tmvp strong-intra-smoothing lslices=419ef54584b7 x265 [info]: tools: deblock sao dhdr10-info19ef54584b8 [matroska @ 0x55d090600900] Only audio, video, and subtitles are supported for Matroska.19ef54584b8 [out#0/matroska @ 0x55d0905ec0c0] Could not write header (incorrect codec parameters ?): Invalid argument19ef54584b8 [vf#0:0 @ 0x55d090601980] Error sending frames to consumers: Invalid argument19ef54584b8 [vf#0:0 @ 0x55d090601980] Task finished with error code: -22 (Invalid argument)19ef54584b8 [vf#0:0 @ 0x55d090601980] Terminating thread with return code -22 (Invalid argument)19ef54586fe [out#0/matroska @ 0x55d0905ec0c0] Nothing was written into output file, because at least one of its streams received no packets.19ef54586fe frame= 0 fps=0.0 q=0.0 Lsize= 0KiB time=00:04:34.77 bitrate= 0.0kbits/s speed= 256x elapsed=0:00:01.0719ef54586ff frame=019ef54586ff fps=0.0019ef54586ff stream_0_0_q=0.019ef54586ff bitrate= 0.0kbits/s19ef54586ff total_size=019ef54586ff out_time_us=27477500019ef54586ff out_time_ms=27477500019ef54586ff out_time=00:04:34.77500019ef54586ff dup_frames=019ef54586ff drop_frames=019ef54586ff speed= 256x19ef54586ff progress=end19ef545870019ef5458700 encoded 0 frames19ef5458705 Conversion failed!Showing 1–9 of 9▼x265-butlerContainer2026-06-23T16:17:03.616Z INFO job enqueued {"requestId":"e5c89d39-3d1b-41be-bb8e-6d238e19cc2e","route":"/api/queue","method":"POST","action":"enqueue","jobId":9,"fileId":42,"encoder":"libx265"}2026-06-23T16:17:04.362Z INFO job transition: queued→encoding {"action":"job_transition","jobId":9,"fileId":42,"transition":"queued→encoding","encoder":"libx265"}2026-06-23T16:17:04.363Z INFO dispatch_preset_resolved {"jobId":9,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-23T16:17:04.365Z INFO preflight_statfs_probe {"jobId":9,"fileId":42,"encoder":"libx265","paths_probed":[{"path":"/cache/work/9/input","statfs_ok":true},{"path":"/cache/work/9/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5453-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-23T16:17:13.773Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5453.MOV","durationMs":9408,"result":"3840:2160:0:0"}2026-06-23T16:17:13.774Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":9,"fileId":42,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}2026-06-23T16:17:15.043Z INFO job transition: encoding→failed {"action":"job_transition","jobId":9,"fileId":42,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}2026-06-23T16:17:15.119Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-23T16:18:02.245Z INFO diagnostics.page.opened {"event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0}2026-06-23T16:18:02.360Z INFO diagnostics.log-event {"event":"copyReportGated","source":"diagnostics-client"}2026-06-23T16:18:09.514Z INFO testEncodeTriggered {"encoder":"libx265","durationMs":332,"outcome":"success","exitCode":0}2026-06-23T16:18:09.542Z INFO diagnostics.log-event {"event":"copyReportUnlocked","source":"diagnostics-client","outcome":"success","encoderPicked":"libx265"}And the logs for a large file I'm trying to convert, I have attached the file (which seems truncated, but is exactly the same in the UI...)7.logTest Encode is in success, and I have tried X265_POOLS to 16/32/64 with no success...Diagnostic Report## x265-butler diagnostics report### App- version: 2.35.0- gitHash: f944b8d2- committedAt: 1782209160- committedAtCET: 23.06.26, 12:06:00### Runtime- nodeVersion: v22.23.0- platform: linux- arch: x64- uptimeSec: 442- pid: 52### Mounts| path | readable | writable | error ||---|---|---|---|| /media | ✓ | ✓ | || /cache | ✓ | ✓ | || /config | ✓ | ✓ | |### Cache- effectivePath: /cache- resolution: user-override- settingValue: /cache- writable: ✓### Devices- DRI: /dev/dri/card0, /dev/dri/renderD128- NVIDIA: /dev/nvidia0, /dev/nvidiactl### Encoders- detected: libx265- detection warnings:- encoder_runtime_broken — nvenc: 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating thread with return code -22 (Invalid argument)- probe outcomes:- nvenc: compiled-in-broken — 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating thread with return code -22 (Invalid argument)- qsv: missing- vaapi: missing- libx265: functional### Active warnings- WARN encoder:encoder_runtime_broken — nvenc: 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating### Recent errors (in-memory, last ≤25)_no recent errors_### Onboarding- completed: ✓- hasShare: ✓## Container Image- OS: Debian GNU/Linux 13 (trixie)- GLIBC: 2.41- Intel Media Driver: — (so-symlink)- libva: 2.22.0-3- libdrm: 2.4.124-2- oneVPL MFX runtime (libmfx-gen1.2): 25.1.4-1- oneVPL dispatcher (libvpl2): 1:2.14.0-1+b1- libigfxcmrt7: 25.2.3+dfsg1-1- _(oneVPL versions report installed-package presence; runtime QSV-functionality is verified separately by the probe-encode — 23-04)_- ffmpeg version: N-125095-g364d309af8-20260618<details><summary>ffmpeg configuration flags</summary>```--prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618```</details>## CPU- Vendor: AuthenticAMD- Model name: AMD Ryzen Threadripper 3990X 64-Core Processor- CPUID family/model: 23 / 49- Microarch: —- Graphics gen: —- HEVC-QSV (hardware): unknown- _(HEVC-QSV reflects iGPU HARDWARE capability by the embedded gen-table; runtime QSV functionality is verified separately by the probe-encode — 23-04)_## Blocklist Evaluation<!-- Operator: paths below are verbatim. Redact mount/user prefixes before posting if sensitive. -->- Total entries: 0- Pattern cache: —_No recent evaluations._## Slow Requests_No slow requests recorded (threshold: 1s)._## Slow Queries_No slow queries recorded (threshold: 100ms)._## Web Vitals_No web vitals recorded._## DRI Render Devices| Device | GID | Group | In group | R | W | Error ||---|---|---|---|---|---|---|| /dev/dri/renderD128 | 18 | — | ✗ | ✓ | ✓ | |_Group name is container-side and informational; the numeric GID is authoritative. No render device reported an access failure that group membership would resolve — PGID / --group-add changes are not required._### Last test-encode (client UAT run)- outcome: success- encoderPicked: libx265- durationMs: 265- exitCode: 0stderr:```Input #0, lavfi, from 'testsrc=size=320x240:rate=1:duration=5':Duration: N/A, start: 0.000000, bitrate: N/AStream #0:0: Video: wrapped_avframe, rgb24, 320x240 [SAR 1:1 DAR 4:3], 1 fps, 1 tbr, 1 tbnStream mapping:Stream #0:0 -> #0:0 (wrapped_avframe (native) -> hevc (libx265))Press [q] to stop, [?] for helpx265 [info]: HEVC encoder version 4.2+5-7b3d1f51x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 8bit+10bit+12bitx265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2x265 [warning]: halving the quality when psy-rd is enabled for 444 input. Setting cbQpOffset = 6 and crQpOffset = 6x265 [info]: Main 4:4:4 profile, Level-2 (Main tier)x265 [info]: Thread pool created using 16 threadsx265 [info]: Slices : 1x265 [info]: frame threads / pool features : 4 / wpp(4 rows)x265 [warning]: Source height < 720p; disabling lookahead-slicesx265 [info]: Coding QT: max CU size, min CU size : 64 / 8x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intrax265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3x265 [info]: Keyframe min / max / scenecut / bias : 1 / 250 / 40 / 5.00x265 [info]: Cb/Cr QP Offset : 6 / 6x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0x265 [info]: References / ref-limit cu / depth : 3 / off / onx265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1x265 [info]: Rate Control / qCompress : CRF-28.0 / 0.60x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip mode=1 signhide tmvpx265 [info]: tools: b-intra strong-intra-smoothing deblock saoOutput #0, null, to '/dev/null':Metadata:encoder : Lavf62.19.101Stream #0:0: Video: hevc, gbrp(pc, gbr/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], q=2-31, 1 fps, 1 tbnMetadata:encoder : Lavc62.36.101 libx265Side data:CPB properties: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A[out#0/null @ 0x55b818757f40] video:10KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknownframe= 5 fps=0.0 q=25.8 Lsize=N/A time=00:00:03.00 bitrate=N/A speed=15.3x elapsed=0:00:00.19x265 [info]: frame I: 1, Avg QP:20.35 kb/s: 30.37x265 [info]: frame P: 2, Avg QP:22.61 kb/s: 10.22x265 [info]: frame B: 2, Avg QP:25.89 kb/s: 6.65x265 [info]: Weighted P-Frames: Y:0.0% UV:0.0%encoded 5 frames in 0.14s (35.74 fps), 12.82 kb/s, Avg QP:23.47```_Generated 2026-06-23T16:21:17.419Z_Thanks for the detailed report, and good news, your logs already contain the root cause, so I don't need much more from you.This is not the encoder/hardware path at all (your Test Encode passing and libx265 being functional confirm that). Look at these lines in the small-file log:[matroska @ ...] Only audio, video, and subtitles are supported for Matroska.[out#0/matroska @ ...] Could not write header (incorrect codec parameters ?): Invalid argument[vf#0:0] Task finished with error code: -22 (Invalid argument)encoded 0 framesConversion failed!Your iPhone .MOV files carry several Apple timed-metadata tracks: Stream #0:2..6 Data: none (mebx / 0x7862656D)x265-butler currently copies every input stream into the output. The default output container is MKV (Matroska), and Matroska cannot hold these mebx data streams, so ffmpeg refuses to write the file header and bails before encoding a single frame. That's why it looks like it "fails near the end": the progress bar runs to 100% in ~1 second (speed=256x, frame=0) because ffmpeg only scanned the timestamps, it never actually encoded anything. The fix is on my side: drop the unsupported data streams when muxing to Matroska.This affects basically all recent iPhone footage (the mebx tracks are standard on iOS). A fix is coming in the next release.One thing that would help me confirm your big file is the exact same bug (its attached log got truncated): could you check whether that log also contains the line Only audio, video, and subtitles are supported for Matroska.If yes, same root cause, same fix, nothing else needed. Thanks again for the great bug reports!
June 24Jun 24 Author 🚀 v2.36.0 - AMD/VAAPI card no longer lost after a fresh-install restartghcr.io/masterjb/x265-butler:2.36.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.Pull / upgrade:docker pull ghcr.io/masterjb/x265-butler:latestdocker restart x265-butlerIf your AMD card went missing after restarting on a fresh install - encoding dropping back to CPU until you restarted again - this is the fix. At boot the app was probing for hardware AND starting the queue at the same time, so a real encode could grab the AMD card's single encode session right when the detection probe needed it. The probe failed, the card got marked "broken", and that was cached until the next restart.Detection is now single-flight: the boot probe and the queue share ONE detection run instead of two competing VAAPI probes, and the first encode only starts after detection finishes on an idle GPU. A failed detection is no longer cached either - the next try re-probes fresh.• If a card ever drops out, the "Re-detect hardware" button on the /diagnostics page re-runs detection on demand (with a before/after diff) - no restart needed.No new dependencies, no migrations, encode output byte-identical to v2.35.x.🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:Extra Parameters:--runtime=nvidiaVariables:NVIDIA_VISIBLE_DEVICES = allNVIDIA_DRIVER_CAPABILITIES = compute,video,utilityThe "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.♻️ ROLLBACKIf v2.36.0 misbehaves on your hardware, roll back to the previous image:docker stop x265-butler && docker rm x265-butlerdocker pull ghcr.io/masterjb/x265-butler:2.35.0🔭 COMING NEXT• iPhone / .MOV encodes that fail right away - if an iPhone clip dies before frame 1 ("never finishes, always fails near the end"), it's the Apple timed-metadata track the file carries that the MKV container rejects. Next release teaches the encoder to drop those container-incompatible side tracks so the encode just runs.• Web UI staying snappy under load - better CPU prioritisation so the pages don't get sluggish while several encodes run at once.Plans can change, but that's what's on the bench.
June 24Jun 24 Thanks for the detailed report, and good news, your logs already contain the root cause, so I don't need much more from you.This is not the encoder/hardware path at all (your Test Encode passing and libx265 being functional confirm that). Look at these lines in the small-file log:[matroska @ ...] Only audio, video, and subtitles are supported for Matroska.[out#0/matroska @ ...] Could not write header (incorrect codec parameters ?): Invalid argument[vf#0:0] Task finished with error code: -22 (Invalid argument)encoded 0 framesConversion failed!Your iPhone .MOV files carry several Apple timed-metadata tracks:Stream #0:2..6 Data: none (mebx / 0x7862656D)x265-butler currently copies every input stream into the output. The default output container is MKV (Matroska), and Matroska cannot hold these mebx data streams, so ffmpeg refuses to write the file header and bails before encoding a single frame. That's why it looks like it "fails near the end": the progress bar runs to 100% in ~1 second (speed=256x, frame=0) because ffmpeg only scanned the timestamps, it never actually encoded anything. The fix is on my side: drop the unsupported data streams when muxing to Matroska.This affects basically all recent iPhone footage (the mebx tracks are standard on iOS). A fix is coming in the next release.One thing that would help me confirm your big file is the exact same bug (its attached log got truncated): could you check whether that log also contains the lineOnly audio, video, and subtitles are supported for Matroska.If yes, same root cause, same fix, nothing else needed. Thanks again for the great bug reports!Unfortunately the "big file" log is truncated on the server, it was not caused by the download.I'll try the 2.36.0 in the morning and let you know (for the Apple file too :))
June 24Jun 24 Thanks — I captured another process/thread snapshot during the slow UI state with two active QSV encodes on v2.36.0.The important finding is that ENCODE_NICE is working correctly:ffmpeg NI 19 ffmpeg NI 19Both active encodes are using QSV:-c:v hevc_qsvHowever, the Web UI is still sluggish while the two encodes are running.docker top shows next-server around 100% CPU:next-server ~100% ffmpeg ~68–70% ffmpeg ~68–70%But the host thread view shows that this is not a single hot JS main thread. The CPU is split across the Node/libuv worker pool:3698425 3698456 ... 20.1 libuv-worker next-server 3698425 3698455 ... 20.0 libuv-worker next-server 3698425 3698454 ... 20.0 libuv-worker next-server 3698425 3698453 ... 20.0 libuv-worker next-server 3698425 3698425 ... 18.8 next-serverSo the ~100% next-server CPU appears to be real process CPU, but mostly from libuv worker threads, not from one hot V8/JS main thread.That also explains why the previous .cpuprofile was mostly idle / did not show a clear JS hot loop: the expensive work seems to happen outside the JS main thread, likely in native/libuv worker activity.My current interpretation:ffmpeg priority handling worksQSV is being usedthis does not look like a pure JS/V8 hot loopthe remaining bottleneck seems to be libuv/native worker activity inside the Next server process while encodes are activePossible suspects:frequent fs stat / access / readdir / watch activityprogress or queue polling triggering filesystem or DB worknative DB/filesystem work in the libuv poolsomething scaling with active encodes and/or library sizeWould it make sense to add diagnostics around libuv-heavy paths, filesystem checks, watcher activity, progress update persistence, and queue polling while encodes are active?I attached the process/thread samples and the previous diagnostics/profile material.debug-capture-20260624-090916.zip process-samples.txt x265-node-cpuprofile.tar.gzI tested different UV_THREADPOOL_SIZE values during the same general scenario: two active QSV encodes on x265-butler v2.36.0.### SummaryThe Web UI gets noticeably worse with UV_THREADPOOL_SIZE=8. With 16 and 32 it is better, but still not really fast/snappy.### Observations#### Default / small pool behaviorWith the smaller/default-ish pool, next-server was around ~100% CPU, but the visible libuv workers were already heavily loaded:- next-server: ~100%- 4 libuv workers: ~20% each- UI felt sluggishThis suggests the libuv pool is already saturated even before increasing it. :contentReference[oaicite:0]{index=0}#### UV_THREADPOOL_SIZE=8With UV8, the UI became noticeably sluggish again.The sample shows:- next-server: ~204%- main thread: ~34%- 8 libuv workers: ~20.8–20.9% eachSo all 8 libuv workers appear busy/saturated. This matches the bad UI responsiveness. :contentReference[oaicite:1]{index=1}#### UV_THREADPOOL_SIZE=16With UV16, the UI was better, but still not fast.The sample shows:- next-server: ~206–210%- main thread: ~34–42%- 16 libuv workers: ~10.2–10.6% eachSo the same type of work is spread over more workers. This reduces perceived blocking, but does not reduce the underlying workload. :contentReference[oaicite:2]{index=2} :contentReference[oaicite:3]{index=3}#### UV_THREADPOOL_SIZE=32With UV32, the UI felt slightly better than UV16, but still not really snappy.The sample shows:- next-server: ~192%- main thread: ~38.5%- 32 libuv workers: ~4.6–4.7% eachThis again suggests the larger pool reduces starvation/queueing, but the server is still doing a lot of libuv-backed work during active encodes. :contentReference[oaicite:4]{index=4}### Current interpretationIncreasing UV_THREADPOOL_SIZE helps responsiveness somewhat, but it looks like a workaround rather than a real fix.The key pattern is:```textUV8 -> workers saturated, UI clearly sluggishUV16 -> better, but still not fastUV32 -> slightly better again, but next-server still burns ~190–200% CPUSo it looks like the app is producing a significant amount of libuv/native/filesystem-style work while encodes are running. The threadpool size changes how badly this blocks the UI, but the actual work remains.Likely areas to inspectPossible suspects:repeated fs.stat / fs.access / path checks during active jobsprogress handlingqueue pollingfilesystem scans/watchersSQLite or persistence work triggered too frequentlyper-progress-update DB/file operationsrequest handlers doing filesystem work while encodes are activeAdditional noteThe ffmpeg children are already nice 19, so encode priority itself seems applied correctly. The remaining bottleneck appears to be inside the next-server process / libuv workload, not just ffmpeg CPU priority. process-samples-uv4(default).txt process-samples-uv8.txt process-samples-uv16.txt process-samples-uv32.txt Edited June 24Jun 24 by cmeyer86
June 24Jun 24 Thanks for the detailed report, and good news, your logs already contain the root cause, so I don't need much more from you.This is not the encoder/hardware path at all (your Test Encode passing and libx265 being functional confirm that). Look at these lines in the small-file log:[matroska @ ...] Only audio, video, and subtitles are supported for Matroska.[out#0/matroska @ ...] Could not write header (incorrect codec parameters ?): Invalid argument[vf#0:0] Task finished with error code: -22 (Invalid argument)encoded 0 framesConversion failed!Your iPhone .MOV files carry several Apple timed-metadata tracks:Stream #0:2..6 Data: none (mebx / 0x7862656D)x265-butler currently copies every input stream into the output. The default output container is MKV (Matroska), and Matroska cannot hold these mebx data streams, so ffmpeg refuses to write the file header and bails before encoding a single frame. That's why it looks like it "fails near the end": the progress bar runs to 100% in ~1 second (speed=256x, frame=0) because ffmpeg only scanned the timestamps, it never actually encoded anything. The fix is on my side: drop the unsupported data streams when muxing to Matroska.This affects basically all recent iPhone footage (the mebx tracks are standard on iOS). A fix is coming in the next release.One thing that would help me confirm your big file is the exact same bug (its attached log got truncated): could you check whether that log also contains the lineOnly audio, video, and subtitles are supported for Matroska.If yes, same root cause, same fix, nothing else needed. Thanks again for the great bug reports!Here are the results of my tests.4K file : failed2026-06-24T06:53:57.512Z INFO job enqueued {"requestId":"829bb608-e3bb-48d6-8fab-47c027be01ee","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":5,"encoder":"libx265"}2026-06-24T06:53:58.380Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":5,"transition":"queued→encoding","encoder":"libx265"}2026-06-24T06:53:58.381Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-24T06:53:58.386Z INFO preflight_statfs_probe {"jobId":11,"fileId":5,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-24T06:54:06.549Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME.mkv","durationMs":8162,"result":"3840:1608:0:276"}2026-06-24T06:54:06.549Z INFO auto-crop applied {"action":"crop_applied","jobId":11,"fileId":5,"crop":"3840:1608:0:276","source":"auto","srcWidth":3840,"srcHeight":2160}2026-06-24T06:54:06.551Z INFO x265: libx265 thread-pool cap resolved {"resolvedPools":16,"source":"operator-override","cpuCount":128,"x265PoolsEnv":"16"}2026-06-24T07:44:11.445Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:44.047Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:49:20.438Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:49:52.239Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:49:59.258Z INFO log SSE stream closed {"requestId":"9f52816f-6ebb-462a-a32e-cd21e26b67b9","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":2394299}2026-06-24T07:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":44689853,"skippedActive":0}2026-06-24T08:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":47251325,"skippedActive":0}2026-06-24T09:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":49813060,"skippedActive":0}2026-06-24T10:50:00.065Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":52374899,"skippedActive":0}2026-06-24T11:50:00.066Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":3,"deletedBytes":14083613,"remainingBytes":40853337,"skippedActive":0}2026-06-24T12:24:20.296Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":5,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}2026-06-24T12:31:38.423Z INFO log SSE stream closed {"requestId":"d7b9cbdb-3222-4145-91c7-cf83a1c2f608","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":14109378}Job log still truncated : 11.logCustom (Apple) 4K file : failed2026-06-24T06:54:36.213Z INFO job enqueued {"requestId":"6ecb5b8f-1c27-4261-bbcc-5e56c95ba216","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":7,"encoder":"libx265"}2026-06-24T06:54:36.615Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":7,"transition":"queued→encoding","encoder":"libx265"}2026-06-24T06:54:36.616Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-24T06:54:36.618Z INFO preflight_statfs_probe {"jobId":11,"fileId":7,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-24T06:54:46.296Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T06:54:46.680Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5450.MOV","durationMs":10062,"result":"3840:2160:0:0"}2026-06-24T06:54:46.680Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":11,"fileId":7,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}2026-06-24T06:54:48.444Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":7,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}2026-06-24T06:54:48.526Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:10.687Z INFO SSE stream closed {"requestId":"ddbeb82b-a791-44fc-8856-c49f86446157","route":"/api/events","action":"sse_stream_closed","durationMs":3226541,"deliveredCount":804,"droppedCount":0}2026-06-24T07:44:10.741Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:12.602Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:19.288Z INFO storage_page_rendered {"requestId":"c2e87ed7-5f50-42bd-b291-fd39725ab7d5","route":"/storage:server","shareCount":1,"orphanCount":0}2026-06-24T07:44:19.405Z INFO storage_query_executed {"requestId":"9039594e-3a6a-4146-a217-fd6ae92b117d","route":"/api/storage/shares-table","endpoint":"shares-table","share":"all","duration_ms":1,"rowCount":1}2026-06-24T07:44:19.411Z INFO storage_query_executed {"requestId":"8090c0e8-8d87-427b-a508-0c873d174f51","route":"/api/storage/kpis","endpoint":"kpis","share":"all","duration_ms":0,"rowCount":1}2026-06-24T07:44:19.447Z INFO storage_query_executed {"requestId":"d7689331-3bde-4a70-9dac-415c7bd9185d","route":"/api/storage/buckets","endpoint":"buckets","share":"all","duration_ms":0,"rowCount":4}2026-06-24T07:44:19.452Z INFO storage_query_executed {"requestId":"ccc37d60-8500-46ae-af94-71c461cec4a1","route":"/api/storage/codec-pie","endpoint":"codec-pie","share":"all","duration_ms":0,"rowCount":2}2026-06-24T07:44:19.457Z INFO storage_query_executed {"requestId":"4e2b003c-c9c9-4cde-bf0c-8a6fb859b4a5","route":"/api/storage/top-folders","endpoint":"top-folders","share":"all","depth":2,"duration_ms":0,"rowCount":0}2026-06-24T07:45:11.750Z INFO job enqueued {"requestId":"c7e0c370-cb2c-4ab0-861a-d81f32c0ac53","route":"/api/queue","method":"POST","action":"enqueue","jobId":12,"fileId":6,"encoder":"libx265"}2026-06-24T07:45:12.243Z INFO job transition: queued→encoding {"action":"job_transition","jobId":12,"fileId":6,"transition":"queued→encoding","encoder":"libx265"}2026-06-24T07:45:12.244Z INFO dispatch_preset_resolved {"jobId":12,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-24T07:45:12.246Z INFO preflight_statfs_probe {"jobId":12,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/cache/work/12/input","statfs_ok":true},{"path":"/cache/work/12/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/2026-06-16_Robin des Quoi.x265-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-24T07:45:26.692Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/2026-06-16_Robin des Quoi.x265.mkv","durationMs":14446,"result":"3840:2160:0:0"}2026-06-24T07:45:26.692Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":12,"fileId":6,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}2026-06-24T07:49:38.913Z INFO log SSE stream closed {"requestId":"0970f024-3c10-44b1-b328-8e05a7597cd5","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":179382}2026-06-24T07:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":216612,"skippedActive":0}2026-06-24T08:50:23.455Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":2761594,"skippedActive":0}2026-06-24T09:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":5315929,"skippedActive":0}2026-06-24T10:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":7884175,"skippedActive":0}2026-06-24T11:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":10456545,"skippedActive":0}2026-06-24T12:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":13033429,"skippedActive":0}2026-06-24T13:15:04.474Z INFO job transition: encoding→failed {"action":"job_transition","jobId":12,"fileId":6,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}2026-06-24T13:35:22.679Z INFO log SSE stream closed {"requestId":"652b4bd5-81b4-4015-8a07-0526b394ab89","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":14086033}Job log still truncated : 12.log1080p : success720p : success-> Looks like the encoding of 4K files is generating too much logs, which in the end staturates the stdout (stdout exceeded cap) and in the end kills the encoding ?Even though both 4K log files stopped at ~13MB, when the 1080p log files is 24MB...
June 24Jun 24 Author 9 hours ago, cmeyer86 said:Thanks — I captured another process/thread snapshot during the slow UI state with two active QSV encodes on v2.36.0.The important finding is that ENCODE_NICE is working correctly:ffmpeg NI 19 ffmpeg NI 19Both active encodes are using QSV:-c:v hevc_qsvHowever, the Web UI is still sluggish while the two encodes are running.docker top shows next-server around 100% CPU:next-server ~100% ffmpeg ~68–70% ffmpeg ~68–70%But the host thread view shows that this is not a single hot JS main thread. The CPU is split across the Node/libuv worker pool:3698425 3698456 ... 20.1 libuv-worker next-server 3698425 3698455 ... 20.0 libuv-worker next-server 3698425 3698454 ... 20.0 libuv-worker next-server 3698425 3698453 ... 20.0 libuv-worker next-server 3698425 3698425 ... 18.8 next-serverSo the ~100% next-server CPU appears to be real process CPU, but mostly from libuv worker threads, not from one hot V8/JS main thread.That also explains why the previous .cpuprofile was mostly idle / did not show a clear JS hot loop: the expensive work seems to happen outside the JS main thread, likely in native/libuv worker activity.My current interpretation:ffmpeg priority handling worksQSV is being usedthis does not look like a pure JS/V8 hot loopthe remaining bottleneck seems to be libuv/native worker activity inside the Next server process while encodes are activePossible suspects:frequent fs stat / access / readdir / watch activityprogress or queue polling triggering filesystem or DB worknative DB/filesystem work in the libuv poolsomething scaling with active encodes and/or library sizeWould it make sense to add diagnostics around libuv-heavy paths, filesystem checks, watcher activity, progress update persistence, and queue polling while encodes are active?I attached the process/thread samples and the previous diagnostics/profile material.debug-capture-20260624-090916.zip process-samples.txt x265-node-cpuprofile.tar.gzI tested different UV_THREADPOOL_SIZE values during the same general scenario: two active QSV encodes on x265-butler v2.36.0.### SummaryThe Web UI gets noticeably worse with UV_THREADPOOL_SIZE=8. With 16 and 32 it is better, but still not really fast/snappy.### Observations#### Default / small pool behaviorWith the smaller/default-ish pool, next-server was around ~100% CPU, but the visible libuv workers were already heavily loaded:- next-server: ~100%- 4 libuv workers: ~20% each- UI felt sluggishThis suggests the libuv pool is already saturated even before increasing it. :contentReference[oaicite:0]{index=0}#### UV_THREADPOOL_SIZE=8With UV8, the UI became noticeably sluggish again.The sample shows:- next-server: ~204%- main thread: ~34%- 8 libuv workers: ~20.8–20.9% eachSo all 8 libuv workers appear busy/saturated. This matches the bad UI responsiveness. :contentReference[oaicite:1]{index=1}#### UV_THREADPOOL_SIZE=16With UV16, the UI was better, but still not fast.The sample shows:- next-server: ~206–210%- main thread: ~34–42%- 16 libuv workers: ~10.2–10.6% eachSo the same type of work is spread over more workers. This reduces perceived blocking, but does not reduce the underlying workload. :contentReference[oaicite:2]{index=2} :contentReference[oaicite:3]{index=3}#### UV_THREADPOOL_SIZE=32With UV32, the UI felt slightly better than UV16, but still not really snappy.The sample shows:- next-server: ~192%- main thread: ~38.5%- 32 libuv workers: ~4.6–4.7% eachThis again suggests the larger pool reduces starvation/queueing, but the server is still doing a lot of libuv-backed work during active encodes. :contentReference[oaicite:4]{index=4}### Current interpretationIncreasing UV_THREADPOOL_SIZE helps responsiveness somewhat, but it looks like a workaround rather than a real fix.The key pattern is:```textUV8 -> workers saturated, UI clearly sluggishUV16 -> better, but still not fastUV32 -> slightly better again, but next-server still burns ~190–200% CPUSo it looks like the app is producing a significant amount of libuv/native/filesystem-style work while encodes are running. The threadpool size changes how badly this blocks the UI, but the actual work remains.Likely areas to inspectPossible suspects:repeated fs.stat / fs.access / path checks during active jobsprogress handlingqueue pollingfilesystem scans/watchersSQLite or persistence work triggered too frequentlyper-progress-update DB/file operationsrequest handlers doing filesystem work while encodes are activeAdditional noteThe ffmpeg children are already nice 19, so encode priority itself seems applied correctly. The remaining bottleneck appears to be inside the next-server process / libuv workload, not just ffmpeg CPU priority.process-samples-uv4(default).txt process-samples-uv8.txt process-samples-uv16.txt process-samples-uv32.txtThanks a lot for the very detailed captures, the thread samples, the UI-closed test and the diagnostics report together make the picture clear, so I want to confirm the exact cause before changing anything.Your data points strongly at libuv thread-pool saturation from background filesystem work (not JS, not the database). To nail it down, please run this while the problem is happening, i.e. with your 2 QSV encodes running and the web UI feeling sluggish (not on an idle system, otherwise we miss the exact state we're measuring):docker exec x265-butler sh -c 'timeout 10 strace -f -c -p 1 2>&1 | head -30'What it does: attaches to the x265-butler Node process for 10 seconds and prints a summary of which Linux system calls it made and how often. If the top is dominated by newfstatat/statx (file-stat calls), that confirms the file-watcher is the cause; if it's read/pread64, it's a different path. Either way it tells us exactly where to fix it. The command only observes, it changes nothing and doesn't affect your encodes.Paste me the top lines and I'll take it from there.
June 24Jun 24 Author 🚀 v2.37.0 - Output Stream-Mapping Hardening is liveghcr.io/masterjb/x265-butler:2.37.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.Pull / upgrade:docker pull ghcr.io/masterjb/x265-butler:latestdocker restart x265-butlerTwo encode-output fixes from real footage: iPhone .MOV clips that refused to encode, and long 4K encodes that self-killed hours in.🎬 IPHONE .MOV NOW ENCODESEvery iPhone .MOV failed instantly, exit 234, 0 frames, "Only audio, video, and subtitles are supported for Matroska". It looked like it failed near the end, but the mux header was actually refused before the first frame. Cause: the iPhone attaches Apple timed-metadata (mebx) data streams that Matroska rejects, and we were copying every stream into the MKV. Now the MKV path maps only video/audio/subtitle and attachment streams (your anime ASS fonts are kept) and drops the incompatible ones. MP4 output is unchanged.🐢 4K ENCODES NO LONGER SELF-KILLIf you saw a 4K encode run for hours and then die with "encode:stdout exceeded cap" (cause in the job transition log) while 1080p/720p finished fine, this release fixes exactly that. It was duration-bound, not resolution- or log-size-bound: ffmpeg's progress stream emitted ~2 blocks/sec, so a ~5.5h 4K encode piled up ~40k blocks (~8.4 MiB) and tripped an 8 MiB stdout guard, killing the job near the end. (Your hunch that 4K "generates too much log and saturates stdout" was on the right track, it's the machine-readable progress stream specifically, not the x265 console output.) Progress is now throttled to one update every 30s, so the same encode produces ~660 blocks (~140 KiB) and never gets near the cap. Bonus: the job log "copy report" no longer fills up with progress spam, it now shows the real ffmpeg/x265 output, so the truncated-log problem is gone too.🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:Extra Parameters:--runtime=nvidiaVariables:NVIDIA_VISIBLE_DEVICES = allNVIDIA_DRIVER_CAPABILITIES = compute,video,utilityThe "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.♻️ ROLLBACKIf v2.37.0 misbehaves on your hardware, roll back to the previous image:docker stop x265-butler && docker rm x265-butlerdocker pull ghcr.io/masterjb/x265-butler:2.36.1🔭 COMING NEXTPlans can change, but on the bench right now:• Sharper diagnosis of UI sluggishness during heavy encodes (CPU attribution sampler, waiting on a QSV capture from an affected host)• More robust hardware-encoder detection on multi-GPU / mixed Intel+AMD boxesAs always - if something breaks on your hardware, drop the diagnostics copy-report here and I'll dig in.
June 24Jun 24 Author 3 hours ago, tbal82 said:Here are the results of my tests.4K file : failed2026-06-24T06:53:57.512Z INFO job enqueued {"requestId":"829bb608-e3bb-48d6-8fab-47c027be01ee","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":5,"encoder":"libx265"}2026-06-24T06:53:58.380Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":5,"transition":"queued→encoding","encoder":"libx265"}2026-06-24T06:53:58.381Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-24T06:53:58.386Z INFO preflight_statfs_probe {"jobId":11,"fileId":5,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-24T06:54:06.549Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME.mkv","durationMs":8162,"result":"3840:1608:0:276"}2026-06-24T06:54:06.549Z INFO auto-crop applied {"action":"crop_applied","jobId":11,"fileId":5,"crop":"3840:1608:0:276","source":"auto","srcWidth":3840,"srcHeight":2160}2026-06-24T06:54:06.551Z INFO x265: libx265 thread-pool cap resolved {"resolvedPools":16,"source":"operator-override","cpuCount":128,"x265PoolsEnv":"16"}2026-06-24T07:44:11.445Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:44.047Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:49:20.438Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:49:52.239Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:49:59.258Z INFO log SSE stream closed {"requestId":"9f52816f-6ebb-462a-a32e-cd21e26b67b9","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":2394299}2026-06-24T07:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":44689853,"skippedActive":0}2026-06-24T08:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":47251325,"skippedActive":0}2026-06-24T09:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":49813060,"skippedActive":0}2026-06-24T10:50:00.065Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":52374899,"skippedActive":0}2026-06-24T11:50:00.066Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":3,"deletedBytes":14083613,"remainingBytes":40853337,"skippedActive":0}2026-06-24T12:24:20.296Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":5,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}2026-06-24T12:31:38.423Z INFO log SSE stream closed {"requestId":"d7b9cbdb-3222-4145-91c7-cf83a1c2f608","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":14109378}Job log still truncated : 11.logCustom (Apple) 4K file : failed2026-06-24T06:54:36.213Z INFO job enqueued {"requestId":"6ecb5b8f-1c27-4261-bbcc-5e56c95ba216","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":7,"encoder":"libx265"}2026-06-24T06:54:36.615Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":7,"transition":"queued→encoding","encoder":"libx265"}2026-06-24T06:54:36.616Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-24T06:54:36.618Z INFO preflight_statfs_probe {"jobId":11,"fileId":7,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-24T06:54:46.296Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T06:54:46.680Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5450.MOV","durationMs":10062,"result":"3840:2160:0:0"}2026-06-24T06:54:46.680Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":11,"fileId":7,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}2026-06-24T06:54:48.444Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":7,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}2026-06-24T06:54:48.526Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:10.687Z INFO SSE stream closed {"requestId":"ddbeb82b-a791-44fc-8856-c49f86446157","route":"/api/events","action":"sse_stream_closed","durationMs":3226541,"deliveredCount":804,"droppedCount":0}2026-06-24T07:44:10.741Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:12.602Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:19.288Z INFO storage_page_rendered {"requestId":"c2e87ed7-5f50-42bd-b291-fd39725ab7d5","route":"/storage:server","shareCount":1,"orphanCount":0}2026-06-24T07:44:19.405Z INFO storage_query_executed {"requestId":"9039594e-3a6a-4146-a217-fd6ae92b117d","route":"/api/storage/shares-table","endpoint":"shares-table","share":"all","duration_ms":1,"rowCount":1}2026-06-24T07:44:19.411Z INFO storage_query_executed {"requestId":"8090c0e8-8d87-427b-a508-0c873d174f51","route":"/api/storage/kpis","endpoint":"kpis","share":"all","duration_ms":0,"rowCount":1}2026-06-24T07:44:19.447Z INFO storage_query_executed {"requestId":"d7689331-3bde-4a70-9dac-415c7bd9185d","route":"/api/storage/buckets","endpoint":"buckets","share":"all","duration_ms":0,"rowCount":4}2026-06-24T07:44:19.452Z INFO storage_query_executed {"requestId":"ccc37d60-8500-46ae-af94-71c461cec4a1","route":"/api/storage/codec-pie","endpoint":"codec-pie","share":"all","duration_ms":0,"rowCount":2}2026-06-24T07:44:19.457Z INFO storage_query_executed {"requestId":"4e2b003c-c9c9-4cde-bf0c-8a6fb859b4a5","route":"/api/storage/top-folders","endpoint":"top-folders","share":"all","depth":2,"duration_ms":0,"rowCount":0}2026-06-24T07:45:11.750Z INFO job enqueued {"requestId":"c7e0c370-cb2c-4ab0-861a-d81f32c0ac53","route":"/api/queue","method":"POST","action":"enqueue","jobId":12,"fileId":6,"encoder":"libx265"}2026-06-24T07:45:12.243Z INFO job transition: queued→encoding {"action":"job_transition","jobId":12,"fileId":6,"transition":"queued→encoding","encoder":"libx265"}2026-06-24T07:45:12.244Z INFO dispatch_preset_resolved {"jobId":12,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-24T07:45:12.246Z INFO preflight_statfs_probe {"jobId":12,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/cache/work/12/input","statfs_ok":true},{"path":"/cache/work/12/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/2026-06-16_Robin des Quoi.x265-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-24T07:45:26.692Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/2026-06-16_Robin des Quoi.x265.mkv","durationMs":14446,"result":"3840:2160:0:0"}2026-06-24T07:45:26.692Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":12,"fileId":6,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}2026-06-24T07:49:38.913Z INFO log SSE stream closed {"requestId":"0970f024-3c10-44b1-b328-8e05a7597cd5","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":179382}2026-06-24T07:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":216612,"skippedActive":0}2026-06-24T08:50:23.455Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":2761594,"skippedActive":0}2026-06-24T09:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":5315929,"skippedActive":0}2026-06-24T10:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":7884175,"skippedActive":0}2026-06-24T11:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":10456545,"skippedActive":0}2026-06-24T12:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":13033429,"skippedActive":0}2026-06-24T13:15:04.474Z INFO job transition: encoding→failed {"action":"job_transition","jobId":12,"fileId":6,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}2026-06-24T13:35:22.679Z INFO log SSE stream closed {"requestId":"652b4bd5-81b4-4015-8a07-0526b394ab89","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":14086033}Job log still truncated : 12.log1080p : success720p : success-> Looks like the encoding of 4K files is generating too much logs, which in the end staturates the stdout (stdout exceeded cap) and in the end kills the encoding ?Even though both 4K log files stopped at ~13MB, when the 1080p log files is 24MB...3 hours ago, tbal82 said:Here are the results of my tests.4K file : failed2026-06-24T06:53:57.512Z INFO job enqueued {"requestId":"829bb608-e3bb-48d6-8fab-47c027be01ee","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":5,"encoder":"libx265"}2026-06-24T06:53:58.380Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":5,"transition":"queued→encoding","encoder":"libx265"}2026-06-24T06:53:58.381Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-24T06:53:58.386Z INFO preflight_statfs_probe {"jobId":11,"fileId":5,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-24T06:54:06.549Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME.mkv","durationMs":8162,"result":"3840:1608:0:276"}2026-06-24T06:54:06.549Z INFO auto-crop applied {"action":"crop_applied","jobId":11,"fileId":5,"crop":"3840:1608:0:276","source":"auto","srcWidth":3840,"srcHeight":2160}2026-06-24T06:54:06.551Z INFO x265: libx265 thread-pool cap resolved {"resolvedPools":16,"source":"operator-override","cpuCount":128,"x265PoolsEnv":"16"}2026-06-24T07:44:11.445Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:44.047Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:49:20.438Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:49:52.239Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:49:59.258Z INFO log SSE stream closed {"requestId":"9f52816f-6ebb-462a-a32e-cd21e26b67b9","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":2394299}2026-06-24T07:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":44689853,"skippedActive":0}2026-06-24T08:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":47251325,"skippedActive":0}2026-06-24T09:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":49813060,"skippedActive":0}2026-06-24T10:50:00.065Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":52374899,"skippedActive":0}2026-06-24T11:50:00.066Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":3,"deletedBytes":14083613,"remainingBytes":40853337,"skippedActive":0}2026-06-24T12:24:20.296Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":5,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}2026-06-24T12:31:38.423Z INFO log SSE stream closed {"requestId":"d7b9cbdb-3222-4145-91c7-cf83a1c2f608","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":14109378}Job log still truncated : 11.logCustom (Apple) 4K file : failed2026-06-24T06:54:36.213Z INFO job enqueued {"requestId":"6ecb5b8f-1c27-4261-bbcc-5e56c95ba216","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":7,"encoder":"libx265"}2026-06-24T06:54:36.615Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":7,"transition":"queued→encoding","encoder":"libx265"}2026-06-24T06:54:36.616Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-24T06:54:36.618Z INFO preflight_statfs_probe {"jobId":11,"fileId":7,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-24T06:54:46.296Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T06:54:46.680Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5450.MOV","durationMs":10062,"result":"3840:2160:0:0"}2026-06-24T06:54:46.680Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":11,"fileId":7,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}2026-06-24T06:54:48.444Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":7,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}2026-06-24T06:54:48.526Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:10.687Z INFO SSE stream closed {"requestId":"ddbeb82b-a791-44fc-8856-c49f86446157","route":"/api/events","action":"sse_stream_closed","durationMs":3226541,"deliveredCount":804,"droppedCount":0}2026-06-24T07:44:10.741Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:12.602Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}2026-06-24T07:44:19.288Z INFO storage_page_rendered {"requestId":"c2e87ed7-5f50-42bd-b291-fd39725ab7d5","route":"/storage:server","shareCount":1,"orphanCount":0}2026-06-24T07:44:19.405Z INFO storage_query_executed {"requestId":"9039594e-3a6a-4146-a217-fd6ae92b117d","route":"/api/storage/shares-table","endpoint":"shares-table","share":"all","duration_ms":1,"rowCount":1}2026-06-24T07:44:19.411Z INFO storage_query_executed {"requestId":"8090c0e8-8d87-427b-a508-0c873d174f51","route":"/api/storage/kpis","endpoint":"kpis","share":"all","duration_ms":0,"rowCount":1}2026-06-24T07:44:19.447Z INFO storage_query_executed {"requestId":"d7689331-3bde-4a70-9dac-415c7bd9185d","route":"/api/storage/buckets","endpoint":"buckets","share":"all","duration_ms":0,"rowCount":4}2026-06-24T07:44:19.452Z INFO storage_query_executed {"requestId":"ccc37d60-8500-46ae-af94-71c461cec4a1","route":"/api/storage/codec-pie","endpoint":"codec-pie","share":"all","duration_ms":0,"rowCount":2}2026-06-24T07:44:19.457Z INFO storage_query_executed {"requestId":"4e2b003c-c9c9-4cde-bf0c-8a6fb859b4a5","route":"/api/storage/top-folders","endpoint":"top-folders","share":"all","depth":2,"duration_ms":0,"rowCount":0}2026-06-24T07:45:11.750Z INFO job enqueued {"requestId":"c7e0c370-cb2c-4ab0-861a-d81f32c0ac53","route":"/api/queue","method":"POST","action":"enqueue","jobId":12,"fileId":6,"encoder":"libx265"}2026-06-24T07:45:12.243Z INFO job transition: queued→encoding {"action":"job_transition","jobId":12,"fileId":6,"transition":"queued→encoding","encoder":"libx265"}2026-06-24T07:45:12.244Z INFO dispatch_preset_resolved {"jobId":12,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}2026-06-24T07:45:12.246Z INFO preflight_statfs_probe {"jobId":12,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/cache/work/12/input","statfs_ok":true},{"path":"/cache/work/12/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/2026-06-16_Robin des Quoi.x265-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}2026-06-24T07:45:26.692Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/2026-06-16_Robin des Quoi.x265.mkv","durationMs":14446,"result":"3840:2160:0:0"}2026-06-24T07:45:26.692Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":12,"fileId":6,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}2026-06-24T07:49:38.913Z INFO log SSE stream closed {"requestId":"0970f024-3c10-44b1-b328-8e05a7597cd5","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":179382}2026-06-24T07:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":216612,"skippedActive":0}2026-06-24T08:50:23.455Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":2761594,"skippedActive":0}2026-06-24T09:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":5315929,"skippedActive":0}2026-06-24T10:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":7884175,"skippedActive":0}2026-06-24T11:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":10456545,"skippedActive":0}2026-06-24T12:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":13033429,"skippedActive":0}2026-06-24T13:15:04.474Z INFO job transition: encoding→failed {"action":"job_transition","jobId":12,"fileId":6,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}2026-06-24T13:35:22.679Z INFO log SSE stream closed {"requestId":"652b4bd5-81b4-4015-8a07-0526b394ab89","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":14086033}Job log still truncated : 12.log1080p : success720p : success-> Looks like the encoding of 4K files is generating too much logs, which in the end staturates the stdout (stdout exceeded cap) and in the end kills the encoding ?Even though both 4K log files stopped at ~13MB, when the 1080p log files is 24MB...Thanks for the detailed test, that's exactly the data I needed, and your read was on the right track.I shipped v2.37.0 which fixes precisely this. Two things were going on:1. The 4K "stdout exceeded cap" kill. It wasn't the resolution or the log size, it was duration. ffmpeg's machine-readable progress stream (not the x265 console output) emits ~2 lines/sec, so a ~5.5h 4K encode piled up ~40,000 progress blocks (~8.4 MB) and tripped an 8 MB stdout guard, which killed the job near the end. 1080p/720p finished faster, stayed under the cap, so they succeeded. That's why both 4K logs froze around ~13 MB while the 1080p one reached 24 MB, the 4K jobs were killed mid-stream, the 1080p one ran to completion.2. The truncated job log. Same root cause, the progress stream was flooding the log, so "copy report" was 99% progress spam.v2.37.0 throttles progress to one update every 30s (the same 5.5h encode now produces ~660 blocks, ~140 KB, nowhere near the cap), and it no longer dumps the progress stream into the job log, so "copy report" now shows the real ffmpeg/x265 output.To update:docker pull ghcr.io/masterjb/x265-butler:latestdocker restart x265-butlerCould you re-run the two 4K files once you're on 2.37.0? They should now run to completion, and the copied job log should be readable. Thanks again for the logs!
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.