libvips jxl tweaks

This commit is contained in:
ed 2026-03-23 02:02:15 +00:00
parent edc201752b
commit abdbd69a68
2 changed files with 24 additions and 2 deletions

View file

@ -1723,6 +1723,7 @@ def add_thumbnail(ap):
ap2.add_argument("--th-no-jxl", action="store_true", help="disable jpeg-xl output") ap2.add_argument("--th-no-jxl", action="store_true", help="disable jpeg-xl output")
ap2.add_argument("--th-ff-jpg", action="store_true", help="force jpg output for video thumbs (avoids issues on some FFmpeg builds)") ap2.add_argument("--th-ff-jpg", action="store_true", help="force jpg output for video thumbs (avoids issues on some FFmpeg builds)")
ap2.add_argument("--th-ff-swr", action="store_true", help="use swresample instead of soxr for audio thumbs (faster, lower accuracy, avoids issues on some FFmpeg builds)") ap2.add_argument("--th-ff-swr", action="store_true", help="use swresample instead of soxr for audio thumbs (faster, lower accuracy, avoids issues on some FFmpeg builds)")
ap2.add_argument("--th-vips-jxl", metavar="N", type=int, default=1, help="when to allow generating jxl thumbnails with libvips; 0=never, 1=musl-mallocng, 2=always")
ap2.add_argument("--th-poke", metavar="SEC", type=int, default=300, help="activity labeling cooldown -- avoids doing keepalive pokes (updating the mtime) on thumbnail folders more often than \033[33mSEC\033[0m seconds") ap2.add_argument("--th-poke", metavar="SEC", type=int, default=300, help="activity labeling cooldown -- avoids doing keepalive pokes (updating the mtime) on thumbnail folders more often than \033[33mSEC\033[0m seconds")
ap2.add_argument("--th-clean", metavar="SEC", type=int, default=43200, help="cleanup interval; 0=disabled") ap2.add_argument("--th-clean", metavar="SEC", type=int, default=43200, help="cleanup interval; 0=disabled")
ap2.add_argument("--th-maxage", metavar="SEC", type=int, default=604800, help="max folder age -- folders which haven't been poked for longer than \033[33m--th-poke\033[0m seconds will get deleted every \033[33m--th-clean\033[0m seconds") ap2.add_argument("--th-maxage", metavar="SEC", type=int, default=604800, help="max folder age -- folders which haven't been poked for longer than \033[33m--th-poke\033[0m seconds will get deleted every \033[33m--th-clean\033[0m seconds")

View file

@ -186,6 +186,10 @@ try:
if os.environ.get("PRTY_NO_VIPS"): if os.environ.get("PRTY_NO_VIPS"):
raise ImportError() raise ImportError()
if "VIPS_CONCURRENCY" not in os.environ:
# reduces glibc RAM usage from 4.7 to 3.5 GiB ...yep, still bonkers
os.environ["VIPS_CONCURRENCY"] = "1"
HAVE_VIPS = True HAVE_VIPS = True
import pyvips import pyvips
@ -272,6 +276,18 @@ class ThumbSrv(object):
self.exts_spec_unsafe = set(self.args.th_spec_cnv.split(",")) self.exts_spec_unsafe = set(self.args.th_spec_cnv.split(","))
# libvips can easily gobble up 4 GiB of RAM when generating JXL thumbnails on glibc so let's not
self.vips_jxl = False
if HAVE_VIPS and self.args.th_vips_jxl == 2:
self.vips_jxl = True
elif HAVE_VIPS and self.args.th_vips_jxl == 1:
try:
with open("/proc/self/maps", "rb") as f:
zb = f.read()
self.vips_jxl = b"/ld-musl-" in zb and b"mimalloc" not in zb
except:
pass
self.q: Queue[Optional[tuple[str, str, str, VFS]]] = Queue(self.nthr * 4) self.q: Queue[Optional[tuple[str, str, str, VFS]]] = Queue(self.nthr * 4)
for n in range(self.nthr): for n in range(self.nthr):
Daemon(self.worker, "thumb-{}-{}".format(n, self.nthr)) Daemon(self.worker, "thumb-{}-{}".format(n, self.nthr))
@ -535,7 +551,11 @@ class ThumbSrv(object):
if lib == "pil" and ext in self.fmt_pil and tex in self.fmt_pil: if lib == "pil" and ext in self.fmt_pil and tex in self.fmt_pil:
funs.append(self.conv_pil) funs.append(self.conv_pil)
elif lib == "vips" and ext in self.fmt_vips: elif (
lib == "vips"
and ext in self.fmt_vips
and (tex != "jxl" or self.vips_jxl)
):
funs.append(self.conv_vips) funs.append(self.conv_vips)
elif lib == "raw" and ext in self.fmt_raw: elif lib == "raw" and ext in self.fmt_raw:
funs.append(self.conv_raw) funs.append(self.conv_raw)
@ -825,7 +845,7 @@ class ThumbSrv(object):
b"-q:v", b"-q:v",
unicode(vn.flags["th_qvx"]).encode("ascii"), # default=?? unicode(vn.flags["th_qvx"]).encode("ascii"), # default=??
b"-effort:v", b"-effort:v",
b"8", # default=7, 1=fast, 9=max, 9~=8 but slower b"7", # default=7, 1=fast, 9=max, 9~=8 but slower
] ]
else: else:
cmd += [ cmd += [
@ -854,6 +874,7 @@ class ThumbSrv(object):
elif cmd[-1].lower().endswith(b".jxl") and ( elif cmd[-1].lower().endswith(b".jxl") and (
"Error selecting an encoder" in serr "Error selecting an encoder" in serr
or "find a suitable output format" in serr
or "Automatic encoder selection failed" in serr or "Automatic encoder selection failed" in serr
or "Default encoder for format webp" in serr or "Default encoder for format webp" in serr
or "Unrecognized option 'effort:v" in serr or "Unrecognized option 'effort:v" in serr