# Copyright 2025 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=8 PYTHON_COMPAT=( python3_{11..14} ) DISTUTILS_USE_PEP517=setuptools inherit distutils-r1 optfeature edo DESCRIPTION="Easy-to-use, feature-packed, protable file server" HOMEPAGE="https://github.com/9001/copyparty" SRC_URI="https://github.com/9001/copyparty/releases/download/v${PV}/copyparty-${PV}.tar.gz" LICENSE="MIT" # TODO: licenses of copyparty/web/deps SLOT="0" KEYWORDS="~amd64" IUSE="test" RESTRICT="!test? ( test )" DEPEND=" test? ( dev-python/strip-hints ) " # TODO: This package is unfinished and lacks some features: # - Service scripts: # - contrib/openrc/copyparty: Hardcodes /usr/local/bin, runs as root, exposes /mnt as RW (!?) # - contrib/systemd/copyparty.service: Hardcodes /usr/local/bin, runs as root, in /var/lib/copyparty # - contrib/systemd/copyparty@.service: Runs as an arbitrary user, in /var/lib/copyparty-jail, at boot # - contrib/systemd/copyparty-user.service: User service, runs in /var/lib/copyparty-jail # Ideally, both systemd and openrc scripts would have the same behavior. # I also think it'd be sane to default to a new user/group named copyparty, # and create /var/lib/copyparty with the correct permissions. # # - Default configuration: There's a bunch of examples, find them using: # `find docs contrib -name '*.conf'`. # Ideally one of these would be installed as /etc/copyparty.conf, and an # /etc/copyparty.d directory would be created. I'm not sure what would be # acceptable defaults. # # - Jailing the service with prisonparty/bubbleparty: This program is very # feature-packed, and has a decent security track record, but just has a # massive attack surface with serious repercussions. Some packages provide a # "prisonparty" service, which runs the program in a chroot. This script # hardcodes a lot of things that I'm not sure will work on gentoo, and would # need matching openrc/systemd services as well. # Bundled dependency notice: # A few "web dependencies" are supplied in the copyparty/web/deps directory. # These are mostly things that run in the web browser, such as javascript # libraries, markdown editors, some assets such as fonts, and a sha512 function # implemented in webassembly. # An attempt at rebuilding these was made, but the scripts required too much # patching and should be adapted upstream to be more easily buildable without # docker. Additionally, it's difficult to package npm dependencies in gentoo. # https://gist.github.com/mid-kid/cc7c0c2e1c188c8b135663d547e3dd35 src_prepare() { # Reuse the bundled copy of fusepy for partyfuse # patched in scripts/deps-docker/Dockerfile (under "build fusepy") sed -e '/from fuse import/s/fuse/copyparty.web.deps.&/' \ -i bin/partyfuse.py || die distutils-r1_src_prepare } python_test() { edo bash scripts/run-tests.sh python3 } python_install() { distutils-r1_python_install # Useful utilities listed in bin/README.md # These need to be executed inside the server's data directory # Installed into /usr/libexec as not a single other package installs them python_scriptinto /usr/libexec/copyparty python_newscript bin/partyjournal.py partyjournal python_newscript bin/dbtool.py dbtool } src_install() { distutils-r1_src_install # Not all of the documentation is useful, but it's hard to filter, # and plenty of it is quite useful. dodoc -r docs contrib # These additional scripts can be used through command-line flags or # configuration files, so it makes sense to put them in a predictable # location. A few of these will require customization, the user should # copy them to /etc. insinto /usr/share/copyparty doins -r bin/handlers bin/hooks bin/mtag # Every other package seems to install this, but it needs a service script, # as well as proper creation of the jail + testing. #newbin bin/prisonparty.sh prisonparty # Bubbleparty seems more reasonable, yet I don't see this included in other # packages. Would need an optional sys-apps/bubblewrap dependency. #newbin bin/bubbleparty.sh bubbleparty # Skipped tools: # - bin/partyfuse-streaming.py: Doc tells me this doesn't exist # - bin/partyfuse2.py: The regular partyfuse.py is better supported # - bin/unforget.py: Not listed in README.md, questionable utility # - bin/zmq-recv.py: Not listed in README.md, questionable utility } pkg_postinst() { # Optfeature descriptions from copyparty/svchub.py:SvcHub._feature_test() optfeature "sessions and file/media indexing" dev-lang/python[sqlite] optfeature "image thumbnails (plenty fast)" dev-python/pillow #optfeature "image thumbnails (faster, eats more ram)" vips # pyvips not packaged (yet) optfeature "create thumbnails as webp files" dev-python/pillow[webp] optfeature "transcode audio, create spectrograms, video thumbnails, \ good-but-slow image thumbnails, read audio/media tags" media-video/ffmpeg optfeature "read audio tags (ffprobe is better but slower)" media-libs/mutagen optfeature "secure password hashing (advanced users only)" dev-python/argon2-cffi optfeature "send zeromq messages from event-hooks" dev-python/pyzmq optfeature "read .heif images with pillow (rarely useful)" dev-python/pillow-heif optfeature "read .avif images with pillow (rarely useful)" dev-python/pillow[avif] #optfeature "read RAW images" rawpy # rawpy not packaged (yet) }