add import chickenbits

This commit is contained in:
ed 2024-08-01 18:29:25 +00:00
parent d5c9c8ebbd
commit 72361c99e1
8 changed files with 81 additions and 3 deletions

View file

@ -111,6 +111,7 @@ turn almost any device into a file server with resumable uploads/downloads using
* [HTTP API](#HTTP-API) - see [devnotes](./docs/devnotes.md#http-api) * [HTTP API](#HTTP-API) - see [devnotes](./docs/devnotes.md#http-api)
* [dependencies](#dependencies) - mandatory deps * [dependencies](#dependencies) - mandatory deps
* [optional dependencies](#optional-dependencies) - install these to enable bonus features * [optional dependencies](#optional-dependencies) - install these to enable bonus features
* [dependency chickenbits](#dependency-chickenbits) - prevent loading an optional dependency
* [optional gpl stuff](#optional-gpl-stuff) * [optional gpl stuff](#optional-gpl-stuff)
* [sfx](#sfx) - the self-contained "binary" (recommended!) * [sfx](#sfx) - the self-contained "binary" (recommended!)
* [copyparty.exe](#copypartyexe) - download [copyparty.exe](https://github.com/9001/copyparty/releases/latest/download/copyparty.exe) (win8+) or [copyparty32.exe](https://github.com/9001/copyparty/releases/latest/download/copyparty32.exe) (win7+) * [copyparty.exe](#copypartyexe) - download [copyparty.exe](https://github.com/9001/copyparty/releases/latest/download/copyparty.exe) (win8+) or [copyparty32.exe](https://github.com/9001/copyparty/releases/latest/download/copyparty32.exe) (win7+)
@ -2044,6 +2045,41 @@ enable [smb](#smb-server) support (**not** recommended):
`pyvips` gives higher quality thumbnails than `Pillow` and is 320% faster, using 270% more ram: `sudo apt install libvips42 && python3 -m pip install --user -U pyvips` `pyvips` gives higher quality thumbnails than `Pillow` and is 320% faster, using 270% more ram: `sudo apt install libvips42 && python3 -m pip install --user -U pyvips`
### dependency chickenbits
prevent loading an optional dependency , for example if:
* you have an incompatible version installed and it causes problems
* you just don't want copyparty to use it, maybe to save ram
set any of the following environment variables to disable its associated optional feature,
| env-var | what it does |
| -------------------- | ------------ |
| `PRTY_NO_CFSSL` | never attempt to generate self-signed certificates using [cfssl](https://github.com/cloudflare/cfssl) |
| `PRTY_NO_FFMPEG` | **audio transcoding** goes byebye, **thumbnailing** must be handled by Pillow/libvips |
| `PRTY_NO_FFPROBE` | **audio transcoding** goes byebye, **thumbnailing** must be handled by Pillow/libvips, **metadata-scanning** must be handled by mutagen |
| `PRTY_NO_IPV6` | disable some ipv6 support (should not be necessary since windows 2000) |
| `PRTY_NO_LZMA` | disable streaming xz compression of incoming uploads |
| `PRTY_NO_MP` | disable all use of the python `multiprocessing` module (actual multithreading, cpu-count for parsers/thumbnailers) |
| `PRTY_NO_MUTAGEN` | do not use [mutagen](https://pypi.org/project/mutagen/) for reading metadata from media files; will fallback to ffprobe |
| `PRTY_NO_PIL` | disable all [Pillow](https://pypi.org/project/pillow/)-based thumbnail support; will fallback to libvips or ffmpeg |
| `PRTY_NO_PILF` | disable Pillow `ImageFont` text rendering, used for folder thumbnails |
| `PRTY_NO_PIL_AVIF` | disable 3rd-party Pillow plugin for [AVIF support](https://pypi.org/project/pillow-avif-plugin/) |
| `PRTY_NO_PIL_HEIF` | disable 3rd-party Pillow plugin for [HEIF support](https://pypi.org/project/pyheif-pillow-opener/) |
| `PRTY_NO_PIL_WEBP` | disable use of native webp support in Pillow |
| `PRTY_NO_PSUTIL` | do not use [psutil](https://pypi.org/project/psutil/) for reaping stuck hooks and plugins on Windows |
| `PRTY_NO_SQLITE` | disable all database-related functionality (file indexing, metadata indexing, most file deduplication logic) |
| `PRTY_NO_TLS` | disable native HTTPS support; if you still want to accept HTTPS connections then TLS must now be terminated by a reverse-proxy |
| `PRTY_NO_VIPS` | disable all [libvips](https://pypi.org/project/pyvips/)-based thumbnail support; will fallback to Pillow or ffmpeg |
example: `PRTY_NO_PIL=1 python3 copyparty-sfx.py`
* `PRTY_NO_PIL` saves ram
* `PRTY_NO_VIPS` saves ram and startup time
* python2.7 on windows: `PRTY_NO_FFMPEG` + `PRTY_NO_FFPROBE` saves startup time
## optional gpl stuff ## optional gpl stuff
some bundled tools have copyleft dependencies, see [./bin/#mtag](bin/#mtag) some bundled tools have copyleft dependencies, see [./bin/#mtag](bin/#mtag)

View file

@ -68,6 +68,9 @@ if True: # pylint: disable=using-constant-test
from typing import Any, Optional from typing import Any, Optional
try: try:
if os.environ.get("PRTY_NO_TLS"):
raise Exception()
HAVE_SSL = True HAVE_SSL = True
import ssl import ssl
except: except:

View file

@ -9,7 +9,7 @@ import time
from .__init__ import ANYWIN from .__init__ import ANYWIN
from .util import Netdev, runcmd, wrename, wunlink from .util import Netdev, runcmd, wrename, wunlink
HAVE_CFSSL = True HAVE_CFSSL = not os.environ.get("PRTY_NO_CFSSL")
if True: # pylint: disable=using-constant-test if True: # pylint: disable=using-constant-test
from .util import NamedLogger, RootLogger from .util import NamedLogger, RootLogger

View file

@ -25,6 +25,9 @@ from operator import itemgetter
import jinja2 # typechk import jinja2 # typechk
try: try:
if os.environ.get("PRTY_NO_LZMA"):
raise Exception()
import lzma import lzma
except: except:
pass pass

View file

@ -9,6 +9,9 @@ import threading # typechk
import time import time
try: try:
if os.environ.get("PRTY_NO_TLS"):
raise Exception()
HAVE_SSL = True HAVE_SSL = True
import ssl import ssl
except: except:

View file

@ -48,8 +48,8 @@ def have_ff(scmd: str) -> bool:
return bool(shutil.which(scmd)) return bool(shutil.which(scmd))
HAVE_FFMPEG = have_ff("ffmpeg") HAVE_FFMPEG = not os.environ.get("PRTY_NO_FFMPEG") and have_ff("ffmpeg")
HAVE_FFPROBE = have_ff("ffprobe") HAVE_FFPROBE = not os.environ.get("PRTY_NO_FFPROBE") and have_ff("ffprobe")
class MParser(object): class MParser(object):
@ -337,6 +337,9 @@ class MTag(object):
if self.backend == "mutagen": if self.backend == "mutagen":
self._get = self.get_mutagen self._get = self.get_mutagen
try: try:
if os.environ.get("PRTY_NO_MUTAGEN"):
raise Exception()
from mutagen import version # noqa: F401 from mutagen import version # noqa: F401
except: except:
self.log("could not load Mutagen, trying FFprobe instead", c=3) self.log("could not load Mutagen, trying FFprobe instead", c=3)

View file

@ -45,22 +45,34 @@ HAVE_AVIF = False
HAVE_WEBP = False HAVE_WEBP = False
try: try:
if os.environ.get("PRTY_NO_PIL"):
raise Exception()
from PIL import ExifTags, Image, ImageFont, ImageOps from PIL import ExifTags, Image, ImageFont, ImageOps
HAVE_PIL = True HAVE_PIL = True
try: try:
if os.environ.get("PRTY_NO_PILF"):
raise Exception()
ImageFont.load_default(size=16) ImageFont.load_default(size=16)
HAVE_PILF = True HAVE_PILF = True
except: except:
pass pass
try: try:
if os.environ.get("PRTY_NO_PIL_WEBP"):
raise Exception()
Image.new("RGB", (2, 2)).save(BytesIO(), format="webp") Image.new("RGB", (2, 2)).save(BytesIO(), format="webp")
HAVE_WEBP = True HAVE_WEBP = True
except: except:
pass pass
try: try:
if os.environ.get("PRTY_NO_PIL_HEIF"):
raise Exception()
from pyheif_pillow_opener import register_heif_opener from pyheif_pillow_opener import register_heif_opener
register_heif_opener() register_heif_opener()
@ -69,6 +81,9 @@ try:
pass pass
try: try:
if os.environ.get("PRTY_NO_PIL_AVIF"):
raise Exception()
import pillow_avif # noqa: F401 # pylint: disable=unused-import import pillow_avif # noqa: F401 # pylint: disable=unused-import
HAVE_AVIF = True HAVE_AVIF = True
@ -80,6 +95,9 @@ except:
pass pass
try: try:
if os.environ.get("PRTY_NO_VIPS"):
raise Exception()
HAVE_VIPS = True HAVE_VIPS = True
import pyvips import pyvips

View file

@ -98,6 +98,9 @@ except:
pass pass
try: try:
if os.environ.get("PRTY_NO_SQLITE"):
raise Exception()
HAVE_SQLITE3 = True HAVE_SQLITE3 = True
import sqlite3 import sqlite3
@ -106,6 +109,9 @@ except:
HAVE_SQLITE3 = False HAVE_SQLITE3 = False
try: try:
if os.environ.get("PRTY_NO_PSUTIL"):
raise Exception()
HAVE_PSUTIL = True HAVE_PSUTIL = True
import psutil import psutil
except: except:
@ -140,6 +146,9 @@ if TYPE_CHECKING:
FAKE_MP = False FAKE_MP = False
try: try:
if os.environ.get("PRTY_NO_MP"):
raise ImportError()
import multiprocessing as mp import multiprocessing as mp
# import multiprocessing.dummy as mp # import multiprocessing.dummy as mp
@ -158,6 +167,9 @@ else:
try: try:
if os.environ.get("PRTY_NO_IPV6"):
raise Exception()
socket.inet_pton(socket.AF_INET6, "::1") socket.inet_pton(socket.AF_INET6, "::1")
HAVE_IPV6 = True HAVE_IPV6 = True
except: except: