mirror of
https://github.com/9001/copyparty.git
synced 2026-03-25 09:32:56 +10:00
libvips jxl tweaks
This commit is contained in:
@@ -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-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-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-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")
|
||||
|
||||
@@ -186,6 +186,10 @@ try:
|
||||
if os.environ.get("PRTY_NO_VIPS"):
|
||||
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
|
||||
import pyvips
|
||||
|
||||
@@ -272,6 +276,18 @@ class ThumbSrv(object):
|
||||
|
||||
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)
|
||||
for n in range(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:
|
||||
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)
|
||||
elif lib == "raw" and ext in self.fmt_raw:
|
||||
funs.append(self.conv_raw)
|
||||
@@ -825,7 +845,7 @@ class ThumbSrv(object):
|
||||
b"-q:v",
|
||||
unicode(vn.flags["th_qvx"]).encode("ascii"), # default=??
|
||||
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:
|
||||
cmd += [
|
||||
@@ -854,6 +874,7 @@ class ThumbSrv(object):
|
||||
|
||||
elif cmd[-1].lower().endswith(b".jxl") and (
|
||||
"Error selecting an encoder" in serr
|
||||
or "find a suitable output format" in serr
|
||||
or "Automatic encoder selection failed" in serr
|
||||
or "Default encoder for format webp" in serr
|
||||
or "Unrecognized option 'effort:v" in serr
|
||||
|
||||
Reference in New Issue
Block a user