Skip to content

v0.7.0.0

Choose a tag to compare

@mugurc mugurc released this 27 Jul 09:50
· 43 commits to main since this release

Answers issue #4 with a debug switch — and fixes four defects that switch made visible.

Explain every decision in the log

A new General option. With it on, every library item logs what ffprobe found, each trigger-rule condition with its configured value, the value it was compared against and whether it passed, and the reason anything was skipped:

Pre-Transcode evaluation of /media/Movie.mkv:
  video=hevc 1920x1080 @ unknown (probe reported none) kbps, fps=23.976,
  audio=aac/2ch, container=matroska,webm, duration=118 min, size=4021 MB
  rule 'h265 too big (2hr)' (match ALL) => MATCH
      VideoCodec In 'HEVC' | actual: hevc => PASS
      VideoDurationMinutes GreaterThanOrEqual '100' | actual: 118 => PASS
      FileSizeMb GreaterThanOrEqual '950' | actual: 4021 => PASS
  verdict: at least one rule matched

Previously the evaluator had eight silent exits and only logged on success, so a rule that did not fire was undiagnosable.

Fixes

  • A matched rule could be silently vetoed. The compliance check compares codec, container, resolution, audio and HDR — never file size or bitrate — so a profile meant to shrink material that already carries the target codec found every such file "compliant" and dropped it. Profiles can now switch off Skip files already matching this profile. On by default, so nothing changes for existing setups.
  • A profile could write its output over its own source (separate-directory mode, no output directory, container matching the source's extension). The result was a Movie (1).mkv beside the original, which Jellyfin indexed as a second movie and the next sweep re-encoded into Movie (1) (1).mkv — one more generation every sweep. Now refused with an actionable message, on both the sweep and the manual single-item path.
  • 10-bit sources were flattened to 8-bit, and HDR with tone-mapping off produced 8-bit samples still tagged as HDR — the one combination that is always wrong. The chosen encoder is now asked which pixel formats it accepts (they differ: yuv420p10le for libx265, p010le for the NVENC/QSV/AMF families, none at all for h264_qsv) and the depth is kept for HEVC/AV1/VP9 targets and for untone-mapped HDR. H.264 still gets 8-bit — its 10-bit profile is not hardware-decodable on most clients. Configurable per profile.
  • Duration rules died silently on files whose container reports no format-level duration. The probe now falls back to the longest stream, then to the Matroska DURATION tag.

Also

  • A non-media file now fails with could not probe source file instead of a raw ffmpeg error code.
  • An alternate version Jellyfin already groups by filename is no longer linked a second time — on 10.11 that made the version picker list the transcode twice.
  • Pausing the queue survives a server restart.
  • Optional cap on retained finished jobs (0 = keep everything, the default).

Verified

219 unit tests, plus 44 scenarios run against a live Jellyfin 10.11.11 with real ffmpeg: all three output policies, the discard-if-larger and compliance-skip paths, five failure paths, job trimming, cancel, pause/resume (confirmed to actually suspend the encoder process), concurrency, seven rule-condition combinations through a per-library override, and the alternate-version merge.