chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 12:06:26 +08:00
commit b57ae13b46
470 changed files with 134981 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
FROM alpine:latest
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-ac" \
org.opencontainers.image.description="copyparty with Pillow and FFmpeg (image/audio/video thumbnails, audio transcoding, media tags)"
ENV XDG_CONFIG_HOME=/cfg
ARG ADD_PKG=""
RUN apk --no-cache add !pyc ${ADD_PKG} \
tzdata wget mimalloc2 mimalloc2-insecure bubblewrap \
py3-jinja2 py3-argon2-cffi py3-pyzmq \
py3-openssl py3-paramiko py3-pillow
COPY i innvikler.sh ./
RUN ash innvikler.sh ac
#vbt
WORKDIR /state
EXPOSE 3923
ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "-c", "/z/initcfg"]
+43
View File
@@ -0,0 +1,43 @@
FROM alpine:latest
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-dj" \
org.opencontainers.image.description="copyparty with all optional dependencies, including musical key / bpm detection"
ENV XDG_CONFIG_HOME=/cfg
ARG ADD_PKG=""
COPY i/bin/mtag/install-deps.sh ./
COPY i/bin/mtag/audio-bpm.py /mtag/
COPY i/bin/mtag/audio-key.py /mtag/
RUN apk add -U !pyc ${ADD_PKG} \
tzdata wget mimalloc2 mimalloc2-insecure bubblewrap \
py3-jinja2 py3-argon2-cffi py3-pyzmq \
py3-openssl py3-paramiko py3-pillow \
py3-magic \
vips-jxl vips-poppler vips-magick \
py3-numpy fftw libsndfile \
vamp-sdk vamp-sdk-libs keyfinder-cli \
libraw-tools \
&& apk add -t .bd \
bash wget gcc g++ make cmake patchelf \
ffmpeg ffmpeg-dev \
python3-dev fftw-dev libsndfile-dev \
py3-pip py3-wheel py3-setuptools py3-numpy-dev \
vamp-sdk-dev \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \
&& python3 -m pip install pyvips --no-build-isolation \
&& bash install-deps.sh \
&& apk del .bd \
&& chmod 777 /root \
&& ln -s /root/vamp /root/.local /
COPY i innvikler.sh ./
RUN ash innvikler.sh dj
#vbt
WORKDIR /state
EXPOSE 3923
ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "-c", "/z/initcfg"]
+81
View File
@@ -0,0 +1,81 @@
FROM DO_NOT_USE_THIS_DOCKER_IMAGE
# this image is an unmaintained experiment to see whether alpine was the correct choice (it was)
#FROM debian:12-slim
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty/tree/hovudstraum/scripts/docker" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-djd" \
org.opencontainers.image.description="copyparty with all optional dependencies, including musical key / bpm detection, and higher performance than the other editions"
ENV PYTHONPYCACHEPREFIX=/tmp/pyc \
XDG_CONFIG_HOME=/cfg
COPY i/bin/mtag/install-deps.sh ./
COPY i/bin/mtag/audio-bpm.py /mtag/
COPY i/bin/mtag/audio-key.py /mtag/
# Suites: bookworm bookworm-updates
# Components: main
RUN sed -ri 's/( main)$/\1 contrib non-free non-free-firmware/' /etc/apt/sources.list.d/debian.sources \
&& apt update \
&& DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
wget \
python3-argon2 python3-pillow python3-pip \
ffmpeg libvips42 vamp-plugin-sdk \
python3-numpy libfftw3-double3 libsndfile1 \
gcc g++ make cmake patchelf jq \
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev \
libfftw3-dev python3-dev libsndfile1-dev python3-pip \
patchelf cmake \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \
&& python3 -m pip install --user pyvips \
&& bash install-deps.sh \
&& DEBIAN_FRONTEND=noninteractive apt purge -y \
gcc g++ make cmake patchelf jq \
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev \
libfftw3-dev python3-dev libsndfile1-dev python3-pip \
patchelf cmake \
&& DEBIAN_FRONTEND=noninteractive apt-get autoremove -y \
&& dpkg -r --force-depends libraqm0 libgdbm-compat4 libgdbm6 libperl5.36 perl-modules-5.36 mailcap mime-support \
&& DEBIAN_FRONTEND=noninteractive apt-get clean -y \
&& find /usr/ -name __pycache__ | xargs rm -rf \
&& find /usr/ -type d -name tests | grep packages/numpy | xargs rm -rf \
&& rm -rf \
/var/lib/apt/lists/* \
/tmp/pyc \
/usr/lib/python*/dist-packages/pip \
/usr/lib/python*/dist-packages/setuptools \
/usr/lib/*/dri \
/usr/lib/*/mfx \
/usr/share/doc \
/usr/share/X11 \
/usr/share/fonts \
/usr/share/libmysofa \
/usr/share/libthai \
/usr/share/alsa \
/usr/share/bash-completion \
&& chmod 777 /root \
&& ln -s /root/vamp /root/.local / \
&& mkdir /cfg /w \
&& chmod 777 /cfg /w \
&& echo % /cfg > initcfg
COPY i/dist/copyparty-sfx.py ./
WORKDIR /w
EXPOSE 3923
ENTRYPOINT ["python3", "/z/copyparty-sfx.py", "--no-crt", "-c", "/z/initcfg"]
# size: 598 MB
# bpm/key: 485 sec
# idx-bench: 2751 MB/s
# notes:
# libraqm0 (pillow dep) pulls in the other packages mentioned on the dpkg line; saves 50m
# advantage: official packages only
# advantage: ffmpeg with gme, codec2, radiance-hdr
# drawback: ffmpeg bloat; dc1394, flite, mfx, xorg
# drawback: python packaging is a bit jank
# drawback: they apply exciting patches due to old deps
# drawback: dropping perl the hard way might cause issues
+72
View File
@@ -0,0 +1,72 @@
FROM DO_NOT_USE_THIS_DOCKER_IMAGE
# this image is an unmaintained experiment to see whether alpine was the correct choice (it was)
#FROM fedora:39
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty/tree/hovudstraum/scripts/docker" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-djf" \
org.opencontainers.image.description="copyparty with all optional dependencies, including musical key / bpm detection, and higher performance than the other editions"
ENV PYTHONPYCACHEPREFIX=/tmp/pyc \
XDG_CONFIG_HOME=/cfg
COPY i/bin/mtag/install-deps.sh ./
COPY i/bin/mtag/audio-bpm.py /mtag/
COPY i/bin/mtag/audio-key.py /mtag/
RUN dnf install -y \
https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm \
&& dnf install -y --setopt=install_weak_deps=False \
wget \
python3-argon2-cffi python3-pillow python3-pip python3-cffi \
ffmpeg \
vips vips-jxl vips-poppler vips-magick \
python3-numpy fftw libsndfile \
gcc gcc-c++ make cmake patchelf jq \
python3-devel ffmpeg-devel fftw-devel libsndfile-devel python3-setuptools python3-wheel \
vamp-plugin-sdk qm-vamp-plugins \
vamp-plugin-sdk-devel vamp-plugin-sdk-static \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \
&& python3 -m pip install --user pyvips \
&& bash install-deps.sh \
&& dnf erase -y \
gcc gcc-c++ make cmake patchelf jq \
python3-devel ffmpeg-devel fftw-devel libsndfile-devel python3-setuptools python3-wheel \
vamp-plugin-sdk-devel vamp-plugin-sdk-static \
&& dnf clean all \
&& find /usr/ -name __pycache__ | xargs rm -rf \
&& find /usr/ -type d -name tests | grep packages/numpy | xargs rm -rf \
&& rm -rf \
/usr/share/adobe \
/usr/share/fonts \
/usr/share/graphviz \
/usr/share/poppler/cMap \
/usr/share/licenses \
/usr/share/ghostscript \
/usr/share/tesseract \
/usr/share/X11 \
/usr/share/hwdata \
/usr/share/python-wheels \
/usr/bin/cyrusbdb2current \
&& rm -rf /tmp/pyc \
&& chmod 777 /root \
&& ln -s /root/vamp /root/.local / \
&& mkdir /cfg /w \
&& chmod 777 /cfg /w \
&& echo % /cfg > initcfg
COPY i/dist/copyparty-sfx.py ./
WORKDIR /w
EXPOSE 3923
ENTRYPOINT ["python3", "/z/copyparty-sfx.py", "--no-crt", "-c", "/z/initcfg"]
# size: 648 MB
# bpm/key: 410 sec
# idx-bench: 2744 MB/s
# advantage: fairly recent and sane ffmpeg build
# drawback: ffmpeg without gme, codec2, radiance-hdr
# drawback: ffmpeg from rpmfusion, which is both better and smaller than ffmpeg-free, can occasionally fail to install due to repo desync / conflicts
# drawback: ffmpeg bloat; samba, modplug, v4l2
# drawback: manual purging (graphviz/poppler/cmap) can break stuff
+65
View File
@@ -0,0 +1,65 @@
FROM DO_NOT_USE_THIS_DOCKER_IMAGE
# this image is an unmaintained experiment to see whether alpine was the correct choice (it was)
#FROM fedora:38
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty/tree/hovudstraum/scripts/docker" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-djff" \
org.opencontainers.image.description="copyparty with all optional dependencies, including musical key / bpm detection, and higher performance than the other editions"
ENV PYTHONPYCACHEPREFIX=/tmp/pyc \
XDG_CONFIG_HOME=/cfg
COPY i/bin/mtag/install-deps.sh ./
COPY i/bin/mtag/audio-bpm.py /mtag/
COPY i/bin/mtag/audio-key.py /mtag/
RUN dnf install -y --setopt=install_weak_deps=False \
wget \
python3-argon2-cffi python3-pillow python3-pip python3-cffi \
ffmpeg-free \
vips vips-jxl vips-poppler vips-magick \
python3-numpy fftw libsndfile \
gcc gcc-c++ make cmake patchelf jq \
python3-devel ffmpeg-free-devel fftw-devel libsndfile-devel python3-setuptools \
vamp-plugin-sdk qm-vamp-plugins \
vamp-plugin-sdk-devel vamp-plugin-sdk-static \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \
&& python3 -m pip install --user pyvips \
&& bash install-deps.sh \
&& dnf erase -y \
gcc gcc-c++ make cmake patchelf jq \
python3-devel ffmpeg-free-devel fftw-devel libsndfile-devel python3-setuptools \
vamp-plugin-sdk-devel vamp-plugin-sdk-static \
&& dnf clean all \
&& find /usr/ -name __pycache__ | xargs rm -rf \
&& find /usr/ -type d -name tests | grep packages/numpy | xargs rm -rf \
&& rm -rf \
/usr/share/adobe \
/usr/share/fonts \
/usr/share/graphviz \
/usr/share/poppler/cMap \
/usr/share/licenses \
/usr/share/ghostscript \
/usr/share/tesseract \
/usr/share/X11 \
/usr/share/hwdata \
/usr/share/python-wheels \
/usr/bin/cyrusbdb2current \
&& rm -rf /tmp/pyc \
&& chmod 777 /root \
&& ln -s /root/vamp /root/.local / \
&& mkdir /cfg /w \
&& chmod 777 /cfg /w \
&& echo % /cfg > initcfg
COPY i/dist/copyparty-sfx.py ./
WORKDIR /w
EXPOSE 3923
ENTRYPOINT ["python3", "/z/copyparty-sfx.py", "--no-crt", "-c", "/z/initcfg"]
# size: 673 MB
# bpm/key: 408 sec
# idx-bench: 2744 MB/s
# drawback: less ffmpeg features we want, more features we don't (compared to rpmfusion)
+72
View File
@@ -0,0 +1,72 @@
FROM DO_NOT_USE_THIS_DOCKER_IMAGE
# this image is an unmaintained experiment to see whether alpine was the correct choice (it was)
#FROM ubuntu:23.04
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty/tree/hovudstraum/scripts/docker" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-dju" \
org.opencontainers.image.description="copyparty with all optional dependencies, including musical key / bpm detection, and higher performance than the other editions"
ENV PYTHONPYCACHEPREFIX=/tmp/pyc \
XDG_CONFIG_HOME=/cfg
COPY i/bin/mtag/install-deps.sh ./
COPY i/bin/mtag/audio-bpm.py /mtag/
COPY i/bin/mtag/audio-key.py /mtag/
RUN apt update \
&& DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
wget \
python3-argon2 python3-pillow python3-pip \
ffmpeg libvips42 vamp-plugin-sdk \
python3-numpy libfftw3-double3 libsndfile1 \
gcc g++ make cmake patchelf jq \
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev \
libfftw3-dev python3-dev libsndfile1-dev python3-pip \
patchelf cmake \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED
RUN python3 -m pip install --user pyvips \
&& bash install-deps.sh \
&& DEBIAN_FRONTEND=noninteractive apt purge -y \
gcc g++ make cmake patchelf jq \
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev \
libfftw3-dev python3-dev libsndfile1-dev python3-pip \
patchelf cmake \
&& DEBIAN_FRONTEND=noninteractive apt-get clean -y \
&& DEBIAN_FRONTEND=noninteractive apt-get autoremove -y \
&& find /usr/ -name __pycache__ | xargs rm -rf \
&& find /usr/ -type d -name tests | grep site-packages/numpy | xargs rm -rf \
&& rm -rf \
/var/lib/apt/lists/* \
/tmp/pyc \
/usr/lib/python*/dist-packages/pip \
/usr/lib/python*/dist-packages/setuptools \
/usr/lib/*/dri \
/usr/lib/*/mfx \
/usr/share/doc \
/usr/share/X11 \
/usr/share/fonts \
/usr/share/libmysofa \
/usr/share/libthai \
/usr/share/alsa \
/usr/share/bash-completion \
&& chmod 777 /root \
&& ln -s /root/vamp /root/.local / \
&& mkdir /cfg /w \
&& chmod 777 /cfg /w \
&& echo % /cfg > initcfg
COPY i/dist/copyparty-sfx.py ./
WORKDIR /w
EXPOSE 3923
ENTRYPOINT ["python3", "/z/copyparty-sfx.py", "--no-crt", "-c", "/z/initcfg"]
# size: 1198 MB (wowee)
# bpm/key: 516 sec
# idx-bench: 2751 MB/s
# advantage: official packages only
# advantage: ffmpeg with gme, codec2, radiance-hdr
# drawback: python packaging is a bit jank
+23
View File
@@ -0,0 +1,23 @@
FROM alpine:latest
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-im" \
org.opencontainers.image.description="copyparty with Pillow and Mutagen (image thumbnails, media tags)"
ENV XDG_CONFIG_HOME=/cfg
ARG ADD_PKG=""
RUN apk --no-cache add !pyc ${ADD_PKG} \
tzdata wget mimalloc2 mimalloc2-insecure \
py3-jinja2 py3-argon2-cffi \
py3-openssl py3-paramiko py3-pillow py3-mutagen
COPY i innvikler.sh ./
RUN ash innvikler.sh im
#vbt
WORKDIR /state
EXPOSE 3923
ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "-c", "/z/initcfg"]
+31
View File
@@ -0,0 +1,31 @@
FROM alpine:latest
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-iv" \
org.opencontainers.image.description="copyparty with Pillow, FFmpeg, libvips (image/audio/video thumbnails, audio transcoding, media tags)"
ENV XDG_CONFIG_HOME=/cfg
ARG ADD_PKG=""
RUN apk add -U !pyc ${ADD_PKG} \
tzdata wget mimalloc2 mimalloc2-insecure bubblewrap \
py3-jinja2 py3-argon2-cffi py3-pyzmq \
py3-openssl py3-paramiko py3-pillow \
py3-magic \
vips-jxl vips-poppler vips-magick \
libraw-tools \
&& apk add -t .bd \
py3-pip py3-setuptools \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \
&& python3 -m pip install pyvips --no-build-isolation \
&& apk del .bd
COPY i innvikler.sh ./
RUN ash innvikler.sh iv
#vbt
WORKDIR /state
EXPOSE 3923
ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "-c", "/z/initcfg"]
+21
View File
@@ -0,0 +1,21 @@
FROM alpine:latest
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-min" \
org.opencontainers.image.description="just copyparty, no thumbnails / media tags / audio transcoding"
ENV XDG_CONFIG_HOME=/cfg
ARG ADD_PKG=""
RUN apk --no-cache add !pyc ${ADD_PKG} \
py3-jinja2
COPY i innvikler.sh ./
RUN ash innvikler.sh min
#vbt
WORKDIR /state
EXPOSE 3923
ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "--no-thumb", "-c", "/z/initcfg"]
+22
View File
@@ -0,0 +1,22 @@
FROM alpine:latest
WORKDIR /z
LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \
org.opencontainers.image.source="https://github.com/9001/copyparty/tree/hovudstraum/scripts/docker" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="copyparty-min-pip" \
org.opencontainers.image.description="just copyparty, no thumbnails, no media tags, no audio transcoding"
ENV PYTHONPYCACHEPREFIX=/tmp/pyc \
XDG_CONFIG_HOME=/cfg
RUN apk --no-cache add python3 py3-pip !pyc \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \
&& python3 -m pip install copyparty \
&& apk del py3-pip \
&& rm -rf /tmp/pyc \
&& mkdir /cfg /w \
&& chmod 777 /cfg /w \
&& echo % /cfg > initcfg
WORKDIR /w
EXPOSE 3923
ENTRYPOINT ["python3", "-m", "copyparty", "--no-crt", "--no-thumb", "-c", "/z/initcfg"]
+48
View File
@@ -0,0 +1,48 @@
self := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
.PHONY: i min im ac iv dj clean hclean purge sh
all: ac
i:
rm -rf i
mkdir i
tar -cC../../dist copyparty-sfx.py | tar -xvCi
tar -cC../.. bin/mtag | tar -xvCi
# # use stock ffmpeg because ./base/Makefile requires podman;
# # beware: https://github.com/9001/copyparty/blob/hovudstraum/docs/bad-codecs.md
touch i/stock_ffmpeg
min: i
docker build -t copyparty/min:latest -f Dockerfile.min .
im: i
docker build -t copyparty/im:latest -f Dockerfile.im .
ac: i
docker build -t copyparty/ac:latest -f Dockerfile.ac --build-arg ADD_PKG=ffmpeg .
iv: i
docker build -t copyparty/iv:latest -f Dockerfile.iv --build-arg ADD_PKG=ffmpeg .
dj: i
docker build -t copyparty/dj:latest -f Dockerfile.dj --build-arg ADD_PKG=ffmpeg .
clean:
-docker kill `docker ps -q`
-docker rm `docker ps -qa`
-docker rmi -f `docker images -a | awk '/<none>/{print$$3}'`
hclean:
-docker kill `docker ps -q`
-docker rm `docker ps -qa`
-docker rmi `docker images -a | awk '!/^alpine/&&NR>1{print$$3}'`
purge:
-docker kill `docker ps -q`
-docker rm `docker ps -qa`
-docker rmi `docker images -qa` -f
sh:
@printf "\n\033[1;31mopening a shell in the most recently created docker image\033[0m\n"
docker run --rm -it --entrypoint /bin/ash `docker images -aq | head -n 1`
+150
View File
@@ -0,0 +1,150 @@
copyparty is availabe in these repos:
* https://hub.docker.com/u/copyparty
* https://github.com/9001?tab=packages&repo_name=copyparty
# getting started
run this command to grab the latest copyparty image and start it:
```bash
docker run --rm -it -u 1000 -p 3923:3923 -v /mnt/nas:/w -v $PWD/cfgdir:/cfg copyparty/ac
```
* `/w` is the path inside the container that gets shared by default, so mount one or more folders to share below there
* `/cfg` is an optional folder with zero or more config files (*.conf) to load
* `copyparty/ac` is the recommended [image edition](#editions)
* you can download the image from github instead by replacing `copyparty/ac` with `ghcr.io/9001/copyparty-ac`
* if you are using rootless podman, remove `-u 1000`
* if you have selinux, append `:z` to all `-v` args (for example `-v /mnt/nas:/w:z`)
this example is also available as a podman-compatible [docker-compose yaml](https://github.com/9001/copyparty/blob/hovudstraum/docs/examples/docker/basic-docker-compose); example usage: `docker-compose up` (you may need to `systemctl enable --now podman.socket` or similar)
i'm not very familiar with containers, so let me know if this section could be better 🙏
## portainer
* there is a [portainer howto](https://github.com/9001/copyparty/blob/hovudstraum/docs/examples/docker/portainer.md) which is mostly untested
## configuration
> this section basically explains how the [docker-compose yaml](https://github.com/9001/copyparty/blob/hovudstraum/docs/examples/docker/basic-docker-compose) works, so you may look there instead
the container has the same default config as the sfx and the pypi module, meaning it will listen on port 3923 and share the "current folder" (`/w` inside the container) as read-write for anyone
the recommended way to configure copyparty inside a container is to mount a folder which has one or more [config files](https://github.com/9001/copyparty/blob/hovudstraum/docs/examples/docker/basic-docker-compose/copyparty.conf) inside; `-v /your/config/folder:/cfg`
* but you can also provide arguments to the docker command if you prefer that
* config files must be named `something.conf` to get picked up
* there are [more extensive config examples](https://github.com/9001/copyparty/blob/hovudstraum/docs/example.conf) but those are not made for docker so the paths are wrong (`/home/ed/Music` should be `/w/something` and so on)
also see [docker-specific recommendations](#docker-specific-recommendations)
## editions
with image size after installation and when gzipped
* [`min`](https://hub.docker.com/r/copyparty/min) (57 MiB, 20 gz) is just copyparty itself
* [`im`](https://hub.docker.com/r/copyparty/im) (70 MiB, 25 gz) can thumbnail images with pillow, parse media files with mutagen
* [`ac` (163 MiB, 56 gz)](https://hub.docker.com/r/copyparty/ac) is `im` plus ffmpeg for video/audio thumbs + audio transcoding + better tags
* [`iv`](https://hub.docker.com/r/copyparty/iv) (211 MiB, 73 gz) is `ac` plus vips for faster heif / avic / jxl thumbnails
* [`dj`](https://hub.docker.com/r/copyparty/dj) (309 MiB, 104 gz) is `iv` plus beatroot/keyfinder to detect musical keys and bpm
[`ac` is recommended](https://hub.docker.com/r/copyparty/ac) since the additional features available in `iv` and `dj` are rarely useful
| this architecture | can run these editions |
| ------------------------------ | ----------------------------- |
| `x86` aka `i386` aka `386` | `min`, `im`, `ac`, `iv`, `dj` |
| `x86_64` aka `x64` aka `amd64` | `min`, `im`, `ac`, `iv`, `dj` |
| `AArch64` aka `arm64/v8` | `min`, `im`, `ac`, `iv`, `dj` |
| `arm32` aka `arm/v7` | `min`, `im`, `ac` |
| `ppc64le` aka `PowerPC` | `min`, `im`, `ac` |
| `s390x` aka `IBM mainframe` | `min`, `im`, `ac` |
> NOTE: the following editions are unfinished experiments, and not published anywhere: djd djf djff dju
### aftermarket editions
some notable alternative copyparty distributions, made and maintained by other people, unaffiliated unless mentioned otherwise -- please use your own judgement whether to trust these
* https://github.com/0x464e/patentparty has more multimedia codecs than the official images
* as of writing: a modification of the official images, automatically maintained by github actions; looks clean and legit
## detecting bpm and musical key
the `dj` edition comes with `keyfinder` and `beatroot` which can be used to detect music bpm and musical keys
enable them globally in a config file:
```yaml
[global]
e2dsa, e2ts # enable filesystem indexing and multimedia indexing
mtp: .bpm=f,t30,/mtag/audio-bpm.py # should take ~10sec
mtp: key=f,t190,/mtag/audio-key.py # should take ~50sec
```
or enable them for just one volume,
```yaml
[/music] # share name / URL
music # filesystem path inside the docker volume `/w`
flags:
e2dsa, e2ts
mtp: .bpm=f,t30,/mtag/audio-bpm.py
mtp: key=f,t190,/mtag/audio-key.py
```
or using commandline arguments,
```
-e2dsa -e2ts -mtp .bpm=f,t30,/mtag/audio-bpm.py -mtp key=f,t190,/mtag/audio-key.py
```
# faq
the following advice is best-effort and not guaranteed to be entirely correct
* q: starting a rootless container on debian 12 fails with `failed to register layer: lsetxattr user.overlay.impure /etc: operation not supported`
* a: docker's default rootless configuration on debian is to use the overlay2 storage driver; this does not work. Your options are to replace docker with podman (good choice), or to configure docker to use the `fuse-overlayfs` storage driver
# docker-specific recommendations
* copyparty will generally create a `.hist` folder at the top of each volume, which contains the filesystem index, thumbnails and such. For performance reasons, but also just to keep things tidy, it might be convenient to store these inside the config folder instead. Add the line `hist: /cfg/hists/` inside the `[global]` section of your `copyparty.conf` to do this
* if you want more performance, and you're OK with doubling the RAM usage, then consider enabling mimalloc **(maybe buggy)** with one of these:
* `-e LD_PRELOAD=/usr/lib/libmimalloc-secure.so.2` makes download-as-zip **3x** as fast, filesystem-indexing **1.5x** as fast, etc.
* `-e LD_PRELOAD=/usr/lib/libmimalloc-insecure.so.2` adds another 10% speed but makes it easier to exploit future vulnerabilities
* complete example: `podman run --rm -it -p 3923:3923 -v "$PWD:/w:z" -e LD_PRELOAD=/usr/lib/libmimalloc-secure.so.2 copyparty/ac -v /w::r`
## enabling the ftp server
...is tricky because ftp is a weird protocol and docker is making it worse 🎉
add the following three config entries into the `[global]` section of your `copyparty.conf`:
* `ftp: 3921` to enable the service, listening for connections on port 3921
* `ftp-nat: 127.0.0.1` but replace `127.0.0.1` with the actual external IP of your server; the clients will only be able to connect to this IP, even if the server has multiple IPs
* do not add `ftp-nat` if you are running the container with host networking
* `ftp-pr: 12000-12099` to restrict the [passive-mode](http://slacksite.com/other/ftp.html#passive) port selection range; this allows up to 100 simultaneous file transfers
then finally update your docker config so that the port-range you specified (12000-12099) is exposed to the internet
# build the images yourself
basically `./make.sh hclean pull img push` but see [devnotes.md](./devnotes.md)
## adding new packages to the image
in case you wish to make a small modification to the official image, for example [add a python package you need](https://github.com/9001/copyparty/issues/479#issuecomment-3152026483), then you don't *really* need to build the whole image from scratch -- see [modifying an image](./devnotes.md#modifying-an-image) in devnotes
+8
View File
@@ -0,0 +1,8 @@
FROM alpine:latest
WORKDIR /z
RUN apk add py3-pip make gcc musl-dev python3-dev
RUN pip wheel https://files.pythonhosted.org/packages/46/7d/901c6e333fb031b5bfbd1532099200cf859f12aa83689be494eade6685ec/zlib_ng-1.0.0.tar.gz \
&& mkdir whl \
&& mv *.whl whl
+27
View File
@@ -0,0 +1,27 @@
self := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
all:
# build all outdated
bash verchk.sh
ff:
# legally comfy
/usr/bin/time ./build-no265.sh pull img
zlib:
# build zlib-ng from source so we know how the sausage was made
# (still only doing the archs which are officially supported/tested)
podman build --arch amd64 -t localhost/cpp-zlibng-amd64:latest -f Dockerfile.zlibng .
podman run --arch amd64 --rm --log-driver=none -i localhost/cpp-zlibng-amd64:latest tar -cC/z whl | tar -xv
podman build --arch arm64 -t localhost/cpp-zlibng-amd64:latest -f Dockerfile.zlibng .
podman run --arch arm64 --rm --log-driver=none -i localhost/cpp-zlibng-amd64:latest tar -cC/z whl | tar -xv
sh:
@printf "\n\033[1;31mopening a shell in the most recently created docker image\033[0m\n"
docker run --rm -it --entrypoint /bin/ash `docker images -aq | head -n 1`
+3
View File
@@ -0,0 +1,3 @@
buildscripts for custom builds of some dependencies to be used in the docker images
the custom ffmpeg builds are available as alpine APKs here: https://copyparty.eu/ffmpeg/alpine/
+117
View File
@@ -0,0 +1,117 @@
#!/bin/ash
set -e
AVER=3.24
[ $1 = 1 ] && hub=1
ls -al arbeidspakke.sh
stamp=$(date -u +%Y-%m-%d)-$(md5sum <arbeidspakke.sh | cut -c-16)-$1-$(date +%s)
uname -a
apk update
apk upgrade -al
apk add alpine-sdk doas wget
echo permit nopass root > /etc/doas.d/u.conf
cp -pv /root/.abuild/*.pub /etc/apk/keys/ || abuild-keygen -ina
##
## yeet h265
mkdir /ffmpeg
cd /ffmpeg
base=https://github.com/alpinelinux/aports/raw/refs/heads/$AVER-stable/community/ffmpeg/
wget ${base}APKBUILD
awk <APKBUILD -vb="$base" '/"/{o=0}/^source=/{o=1;next}o{print b $1}' | wget -i-
cp -pv APKBUILD /root/
# grep -E '^extern const.* FF[^ ]+ +ff_(hevc|vvc)_' libavcodec/allcodecs.c libavcodec/hwaccels.h libavcodec/bitstream_filters.c libavcodec/parsers.c libavformat/allformats.c | sed -r 's/.* ff_([^/;]*)_([^/;]*);.*/--disable-\2=\1/' | tr '\n' ' '
sed -ri 's/--enable-libx265/--disable-decoder=hevc --disable-decoder=hevc_qsv --disable-decoder=hevc_rkmpp --disable-encoder=hevc_rkmpp --disable-decoder=hevc_v4l2m2m --disable-decoder=vvc --disable-encoder=hevc_amf --disable-decoder=hevc_amf --disable-decoder=hevc_cuvid --disable-encoder=hevc_d3d12va --disable-decoder=hevc_mediacodec --disable-encoder=hevc_mediacodec --disable-encoder=hevc_mf --disable-encoder=hevc_nvenc --disable-decoder=hevc_oh --disable-encoder=hevc_oh --disable-encoder=hevc_qsv --disable-encoder=hevc_v4l2m2m --disable-encoder=hevc_vaapi --disable-encoder=hevc_videotoolbox --disable-encoder=hevc_vulkan --disable-decoder=vvc_qsv --disable-hwaccel=hevc_d3d11va --disable-hwaccel=hevc_d3d11va2 --disable-hwaccel=hevc_d3d12va --disable-hwaccel=hevc_dxva2 --disable-hwaccel=hevc_nvdec --disable-hwaccel=hevc_vaapi --disable-hwaccel=hevc_vdpau --disable-hwaccel=hevc_videotoolbox --disable-hwaccel=hevc_vulkan --disable-hwaccel=vvc_vaapi --disable-bsf=hevc_metadata --disable-bsf=hevc_mp4toannexb --disable-bsf=vvc_metadata --disable-bsf=vvc_mp4toannexb --disable-parser=hevc --disable-parser=vvc --disable-demuxer=hevc --disable-muxer=hevc --disable-demuxer=vvc --disable-muxer=vvc /;s/\bx265-dev\b//' APKBUILD
##
## yeet aac he/he+/ld (sbr/ps); keep lc only
cat >>APKBUILD <<'EOF'
prepare() {
default_prepare
tar -cC/opt/patch/ffmpeg . | tar -x
patch -p1 <aac-lc-only.patch
awk >t <libavcodec/aac/aacdec_tab.c '/^[^ \t]/{o=0} /^(static|const).*( sbr_|_hcod)/{o=1} !o{print;next} {gsub(/\{ *-?[0-9]+, *-?[0-9]+ *\}/, "{ 1, 1 }")}1'
mv t libavcodec/aac/aacdec_tab.c
# invent the missing disable-option for this crap
sed -ri 's/(^v4l2_m2m_deps=")/\1videotoolbox /' configure
awk >t <configure '!o&&/FFMPEG_CONFIGURATION=/{o=1;print"FFMPEG_CONFIGURATION='thecfgstr'";next}1'
cat t >configure; rm t
}
EOF
sed -ri "s/thecfgstr/arbeidspakke-$stamp/" APKBUILD
##
## shrink-ray
sed -ri 's/--enable-lib(bluray|dvdnav|dvdread|placebo|rav1e|shaderc)/--disable-lib\1/; s/--enable-(vdpau)/--disable-\1/; s/\b(rav1e|shaderc)-dev//; s/\blib(bluray|placebo|vdpau|xfixes)-dev\b//' APKBUILD
# `- rm placebo+shaderc to drop spirv-tools (1.7 MiB apk)
sed -ri 's/--enable-libxcb/--disable-libxcb --disable-indev=xcbgrab --disable-ffplay --disable-encoder=opus --disable-decoder=metasound --disable-decoder=twinvq/' APKBUILD
# `- metasound+twinvq = +450 KiB apk
sed -ri 's/\bffplay$//; s/\bsdl2-dev\b//' APKBUILD
##
## golflympics; decode-only, super-specific for copyparty only
[ $hub ] || {
sed -ri 's/--enable-(ladspa|lv2|vaapi|vulkan)/--disable-\1/' APKBUILD
sed -ri 's/--enable-lib(aom|ass|drm|fontconfig|freetype|fribidi|harfbuzz|pulse|rist|srt|ssh|v4l2|vidstab|x264|xvid|zimg|vpl)/--disable-lib\1/' APKBUILD
sed -ri 's/\b(v4l-utils|libvpx)-dev\b//' APKBUILD # (try to) drop v4l2_m2m, and use builtin vp8/vp9 instead of libvpx for decode
sed -ri 's/(--disable-vulkan)/\1 --disable-devices --disable-hwaccels --disable-encoders --enable-encoder=flac --enable-encoder=libjxl --enable-encoder=libmp3lame --enable-encoder=libopus --enable-encoder=libwebp --enable-encoder=mjpeg --enable-encoder=pcm_f32le --enable-encoder=pcm_s16le --enable-encoder=pcm_s16le_planar --enable-encoder=png --enable-encoder=rawvideo --enable-encoder=vnull --enable-encoder=wrapped_avframe --disable-muxers --enable-muxer=aiff --enable-muxer=apng --enable-muxer=caf --enable-muxer=ffmetadata --enable-muxer=fifo --enable-muxer=flac --enable-muxer=image2 --enable-muxer=image2pipe --enable-muxer=matroska --enable-muxer=matroska_audio --enable-muxer=mjpeg --enable-muxer=mp3 --enable-muxer=null --enable-muxer=opus --enable-muxer=pcm_f32le --enable-muxer=pcm_s16le --enable-muxer=wav --enable-muxer=webm --enable-muxer=webp --enable-muxer=yuv4mpegpipe --disable-filters --enable-filter=anoisesrc --enable-filter=asplit --enable-filter=amerge --enable-filter=amix --enable-filter=aresample --enable-filter=crop --enable-filter=showspectrumpic --enable-filter=showwavespic --enable-filter=convolution --enable-filter=volume --enable-filter=compand --enable-filter=setsar --enable-filter=scale --disable-decoder=av1 --disable-hwaccel=v4l2_m2m --disable-decoder=h263_v4l2m2m --disable-decoder=h264_v4l2m2m --disable-decoder=mpeg1_v4l2m2m --disable-decoder=mpeg2_v4l2m2m --disable-decoder=mpeg4_v4l2m2m --disable-decoder=vc1_v4l2m2m --disable-decoder=vp8_v4l2m2m --disable-decoder=vp9_v4l2m2m --disable-decoder=subrip --disable-decoder=srt --disable-decoder=pgssub --disable-decoder=cc_dec --disable-decoder=dvdsub --disable-decoder=dvbsub --disable-decoder=ssa --disable-decoder=ass --disable-decoder=opus /' APKBUILD
# `- s/av1/libdav1d/; s/libvorbis/vorbis/; s/opus/libopus/; libvorbis and mpg123 gets pulled in by openmpt
# grep -E '^extern const.* FF[^ ]+ +ff_.*_(encoder|decoder|hwaccel|bsf|parser|demuxer|muxer);$' libavcodec/allcodecs.c libavcodec/hwaccels.h libavcodec/bitstream_filters.c libavcodec/parsers.c libavformat/allformats.c | sed -r 's/.* ff_([^/;]*)_([^/;]*);.*/\2 \1/' | sort > names
# xsel -o | tr ' ' '\n' | tr . % | grep -E .. | while read x; do grep -qE "^decoder $x$" names || echo "? $x"; done
sed -ri 's/(--disable-vulkan)/\1 '"$(printf '--disable-decoder=%s ' aasc alias_pix anm ansi arbc argo avrn avs bethsoftvid bfi bintext bmv_video brender_pix c93 cdgraphics cdtoons cdxl cljr cllc cpia cscd cyuv dfa dsicinvideo eacmv eamad eatgq eatgv eatqi escape124 escape130 fic fmvc frwu gdv gem hnm4_video idcin idf iff_ilbm imm4 interplay_video ipu jv kgv1 kmvc lead lscr m101 magicyuv mdec media100 mimic mmvideo motionpixels msa1 mscc msp2 mszh mts2 mv30 mvc1 mvc2 mvdv mvha mwsc mxpeg notchlc nuv paf_video pdv photocd pictor ptx qdraw qpeg rasc rl2 rtv1 sanm scpr sga sgirle simbiosis_imx smacker smc smvjpeg snow sp5x srgc tdsc thp tiertexseqvideo tmv truemotion2rt txd ulti vb vble vbn vcr1 vmdvideo vmix vmnc vqa vqc wcmv wnv1 xan_wc3 xan_wc4 xbin xface xl ylc yop zerocodec )/" APKBUILD
# `- codecs: very obscure video
sed -ri 's/(--disable-vulkan)/\1 '"$(printf '--disable-decoder=%s ' acelp_kelvin adpcm_agm adpcm_argo adpcm_ct adpcm_dtk adpcm_ea adpcm_ea_maxis_xa adpcm_ea_r1 adpcm_ea_r2 adpcm_ea_r3 adpcm_ea_xas adpcm_ima_acorn adpcm_ima_alp adpcm_ima_apc adpcm_ima_apm adpcm_ima_cunning adpcm_ima_dat4 adpcm_ima_ea_eacs adpcm_ima_ea_sead adpcm_ima_escape adpcm_ima_hvqm2 adpcm_ima_hvqm4 adpcm_ima_iss adpcm_ima_magix adpcm_ima_mtf adpcm_ima_pda adpcm_ima_rad adpcm_ima_ssi adpcm_mtaf adpcm_vima adpcm_xmd adpcm_zork bmv_audio bonk cbd2_dpcm comfortnoise derf_dpcm dolby_e dsicinaudio dss_sp evrc fastaudio ftr gremlin_dpcm hcom iac interplay_acm interplay_dpcm metasound misc4 mlp osq paf_audio rka roq_dpcm sdx2_dpcm sol_dpcm sonic vmdaudio wady_dpcm wavarc ws_snd1 xan_dpcm )/" APKBUILD
# `- codecs: very obscure audio
sed -ri 's/(--disable-vulkan)/\1 '"$(printf '--disable-decoder=%s ' agm aic amv apv asv1 asv2 aura aura2 avrp avs avui bink bitpacked cavs cfhd cinepak clearvideo cri dirac dxa eightbps flashsv flashsv2 flic fourxm g2m h261 hap hq_hqa hqx indeo2 indeo3 indeo4 indeo5 jpeg2000 jpegls lagarith loco mjpegb mobiclip mss1 mss2 msvideo1 pgx pixlet prosumer qtrle r10k r210 roq roq_dpcm rpza rscc screenpresso sgi sheervideo speedhq sunrast svq1 svq3 truemotion1 truemotion2 truemotion2rt tscc tscc2 vc1image vp3 vp4 vp5 vp6 vp6a vp6f wbmp zero12v )/" APKBUILD
# `- codecs: obscure video
sed -ri 's/(--disable-vulkan)/\1 '"$(printf '--disable-decoder=%s ' adpcm_ima_amv adpcm_ima_dk3 adpcm_ima_dk4 adpcm_ima_moflex adpcm_ima_oki adpcm_ima_smjpeg ahx apac cook dsd_lsbf dsd_lsbf_planar dsd_msbf dsd_msbf_planar eightsvx_exp eightsvx_fib hca ilbc imc mace3 mace6 msnsiren nellymoser pcm_lxf pcm_s24daud pcm_sga pcm_vidc qdm2 qdmc s302m sbc shorten siren truespeech twinvq wmavoice xma1 xma2 )/" APKBUILD
# `- codecs: obscure audio
sed -ri 's/(--disable-vulkan)/\1 '"$(printf '--disable-decoder=%s ' dvvideo dxtory fits fraps pam pfm phm prores prores_raw psd v210 v210x v308 v408 xwd y41p zlib )/" APKBUILD
# `- codecs: not-quite-obscure-but-still-meh video
sed -ri 's/(--disable-vulkan)/\1 '"$(printf '--disable-decoder=%s ' aptx aptx_hd binkaudio_dct binkaudio_rdft )/" APKBUILD
# `- codecs: not-quite-obscure-but-still-meh audio
sed -ri 's/(--disable-vulkan)/\1 '"$(printf '--disable-decoder=%s ' ccaption jacosub microdvd movtext mpl2 pjs realtext sami stl subviewer subviewer1 text vplayer webvtt xsub )/" APKBUILD
# `- oops! all subtitles
sed -ri 's/(--disable-vulkan)/\1 '"$(printf '--disable-demuxer=%s ' aa aax ace acm act adf adp ads adx aea afc aix alp anm apac apc apm aptx aptx_hd apv aqtitle argo_asf argo_brp argo_cvg ass ast avr avs avs2 avs3 bethsoftvid bfi bink binka bintext bit bitpacked bmv boa bonk c93 caf cavsvideo cdg cdxl cine concat dash data daud dcstr derf dfa dhav dirac dsf dsicin dss dv dvbsub dvbtxt dxa ea ea_cdata epaf evc filmstrip fits flic fourxm frm fsb fsb fwse gdv genh gxf hca hcom hls hnm iamf idcin idf ifv ilbc image2_alias_pix image_bmp_pipe image2_brender_pix image_cri_pipe image_dds_pipe image_dpx_pipe image_exr_pipe image_gem_pipe image_hdr_pipe image_j2k_pipe image_jpegls_pipe image_jpegxl_pipe image_jpegxs_pipe image_pam_pipe image_pbm_pipe image_pcx_pipe image_pfm_pipe image_pgm_pipe image_pgmyuv_pipe image_pgx_pipe image_phm_pipe image_photocd_pipe image_pictor_pipe image_ppm_pipe image_psd_pipe image_qdraw_pipe image_qoi_pipe image_sgi_pipe image_sunrast_pipe image_svg_pipe image_tiff_pipe image_vbn_pipe image_webp_pipe image_xbm_pipe image_xpm_pipe image_xwd_pipe ingenient ipmovie ipu ircam iss iv8 ivf ivr jacosub jv kux kvag laf lc3 live_flv lmlm4 loas lrc luodat lvf lxf mca mcc mgsts microdvd mjpeg mjpeg_2000 mlp mlv mm mmf mods moflex mpjpeg mpl2 mpsub msf msnwc_tcp msp mtaf mtv musx mv mvi mxf mxg nc nistsphere nsp nsv nuv obu oma osq paf pcm_vidc pdv pjs pmp pp_bnk pva pvf qcp qoa r3d rawvideo rcwt realtext redspark rka rl2 roq rpl rsd rso rtp rtsp sami sap sbc sbg scc scd sdns sdp sdr2 sds sdx segafilm ser sga shorten siff simbiosis_imx sln smacker smjpeg smush sol spdif srt stl str subviewer subviewer1 sup svag svs tedcaptions thp threedostr tiertexseq tmv truehd tty txd ty usm v210 v210x vag vc1t vividas vivo vmd vobsub voc vpk vplayer vqf w64 wady wavarc wc3 webm_dash_manifest webvtt wsaud wsd wsvqa wtv wve xa xbin xmd xmv xvag xwma yop yuv4mpegpipe )/" APKBUILD
# `- hipster formats / filetypes / demuxers # caf: only need muxing # bfstm=3ds/gc/wii
# cat aaa | grep -E '^ D..... ('"$(xsel -o | tr ' ' '|'))" | grep decoder
# xsel -o | tr ' ' '\n' | LC_ALL=C sort | tr '\n' ' ' | xsel -ib
}
[ $1 -gt 1 ] && sed -ri 's/(--disable-libxcb )/\1--disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages /' APKBUILD
p=/root/packages/$(abuild -A)
rm -rf $p
abuild -FrcK
mkdir $p/ex
mv $p/ffmpeg-d* $p/ex # dbg,dev,doc
cp -pv src/ffmpeg-*/ffbuild/config.log $p/
#tar -cz src > $p/.tar
[ $hub ] && rm -rf $p.hub && mv $p $p.hub
cp -pv /root/.abuild/*.pub ~/packages/
+116
View File
@@ -0,0 +1,116 @@
#!/bin/bash
set -e
AVER=3.24
[ $(id -u) -eq 0 ] && {
echo dont root
exit 1
}
self=$(cd -- "$(dirname "$BASH_SOURCE")"; pwd -P)
cd "$self"
sarchs="386 amd64 arm/v7 arm64/v8 ppc64le s390x"
archs="amd64 amd64 386 arm64 arm s390x ppc64le"
err=
for x in awk jq podman python3 tar wget ; do
command -v $x >/dev/null && continue
err=1; echo ERROR: missing dependency: $x
done
[ $err ] && exit 1
for v in "$@"; do
[ "$v" = pull ] && pull=1
[ "$v" = img ] && img=1
done
[ $# -gt 0 ] || {
echo "need list of commands, for example: pull img"
exit 1
}
wt() {
printf '\033]0;%s\033\\' "$*"
[ -z "$TMUX" ] || tmux renamew "$*"
}
[ $pull ] && {
for a in $sarchs; do
podman pull --arch=$a alpine:$AVER
done
podman images --format "{{.ID}} {{.History}}" |
awk '/library\/alpine/{print$1}' |
while read id; do
tag=alpine-$(podman inspect $id | jq -r '.[]|.Architecture' | tr / -)
[ -e .tag-$tag ] && continue
touch .tag-$tag
echo tagging $tag
podman untag $id
podman tag $id $tag
done
rm .tag-*
}
[ $img ] && {
mkdir -p "$self/b"
# enable arm32 crossbuild from aarch64 (macbook or whatever)
[ $(uname -m) = aarch64 ] && [ ! -e /proc/sys/fs/binfmt_misc/qemu-arm ] &&
echo ":qemu-arm:M:0:\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:F" |
sudo tee >/dev/null /proc/sys/fs/binfmt_misc/register
# kill abandoned builders
ps aux | awk '/bin\/qemu-[^-]+-static/{print$2}' | xargs -r kill -9
n=0; set -xo pipefail
for a in $archs; do
n=$((n+1)); wt "$n/$a"
#[ $n -le 3 ] || continue
touch b/t.$n.$a.1.$(date +%s)
tar -c arbeidspakke.sh patch/ffmpeg |
time nice podman run \
--rm -i --pull=never -v "$self/b:/root:z" localhost/alpine-$a \
/bin/ash -c "cd /opt;tar -x;/bin/ash ./arbeidspakke.sh $n $a" 2>&1 |
awk '{getline a<"/proc/uptime";close("/proc/uptime");sub(/ .*/,"",a);printf"%.2f %s\n",a-p,$0;p=a}' |
tee b/log.$n.$a
touch b/t.$n.$a.2.$(date +%s)
done
wt -;wt ""
}
echo ok
# just-no265
# 4m18.77 x64
# 4m22.81 386
# 45m36.44 arm64
# 34m31.22 ppc64le
# 50m01.04 s390x
# golflympics
# 3:48 x86_64-hub
# 2:21 x86_64
# 2:05 x86
# 22:56 aarch64
# 17:56 armv7
# 25:25 s390x
# 19:11 ppc64le
# 1:33:42 summa summarum
# `- ls -1 t.* | awk -F. '$4==1{v=$5}$4==2{d=$5-v;t+=d;m=int(d/60);s=d-m*60;printf"%d:%02d %s\n",m,s,$3}END{m=int(t/60);s=t-m*60;printf"%d:%02d\n",m,s}'
# for a in version muxers demuxers devices decoders encoders filters pix_fmts layouts sample_fmts bsfs ; do ffmpeg -hide_banner -$a; done | nc 192.168.123.1 4321
# podman run --rm -it --entrypoint /bin/ash copyparty/ac:latest -c 'for a in version muxers demuxers devices decoders encoders filters pix_fmts layouts sample_fmts bsfs ; do ffmpeg -hide_banner -$a; done' > ffmpeg-features.txt
# v=3.24-stable
# echo -n https://dl-cdn.alpinelinux.org/v${v%-*}/releases/x86_64/ >aver
# curl -s $(cat aver)latest-releases.yaml | awk '/alpine-minirootfs-3.*gz$/{print$2;exit}' | grep ... >> aver
# podman import $(cat aver) a324
# f(){ p=/sys/fs;for w in cgroup user.slice user-1000.slice user@1000.service user.slice ;do p="$p/$w";echo $1>"$p/cgroup.subtree_control";done;}
# f +cpuset
# time nice podman run --cpuset-cpus=1 \
# grep -E '^[^0].*' -B2 -A1 log.1.amd64 # offbyone, whatever, just eyeball it
# f -cpuset
+797
View File
@@ -0,0 +1,797 @@
ffmpeg version 8.1.1 Copyright (c) 2000-2026 the FFmpeg developers
built with gcc 15.2.0 (Alpine 15.2.0)
configuration: arbeidspakke-2026-06-26-d7ea02a8a4d74155-2-1782492563
libavutil 60. 26.101 / 60. 26.101
libavcodec 62. 28.101 / 62. 28.101
libavformat 62. 12.101 / 62. 12.101
libavdevice 62. 3.101 / 62. 3.101
libavfilter 11. 14.101 / 11. 14.101
libswscale 9. 5.101 / 9. 5.101
libswresample 6. 3.101 / 6. 3.101
Exiting with exit code 0
Formats:
D.. = Demuxing supported
.E. = Muxing supported
..d = Is a device
---
E aiff Audio IFF
E apng Animated Portable Network Graphics
E caf Apple CAF (Core Audio Format)
E f32le PCM 32-bit floating-point little-endian
E ffmetadata FFmpeg metadata in text
E fifo FIFO queue pseudo-muxer
E flac raw FLAC
E image2 image2 sequence
E image2pipe piped image2 sequence
E matroska Matroska
E mjpeg raw MJPEG video
E mp3 MP3 (MPEG audio layer 3)
E null raw null video
E ogg Ogg
E opus Ogg Opus
E s16le PCM signed 16-bit little-endian
E wav WAV / WAVE (Waveform Audio)
E webm WebM
E webp WebP
E yuv4mpegpipe YUV4MPEG pipe
Formats:
D.. = Demuxing supported
.E. = Muxing supported
..d = Is a device
---
D aac raw ADTS AAC (Advanced Audio Coding)
D ac3 raw AC-3
D ac4 raw AC-4
D aiff Audio IFF
D alaw PCM A-law
D amr 3GPP AMR
D amrnb raw AMR-NB
D amrwb raw AMR-WB
D ape Monkey's Audio
D apng Animated Portable Network Graphics
D asf ASF (Advanced / Active Streaming Format)
D asf_o ASF (Advanced / Active Streaming Format)
D au Sun AU
D av1 AV1 Annex B
D avi AVI (Audio Video Interleaved)
D bfstm BFSTM (Binary Cafe Stream)
D brstm BRSTM (Binary Revolution Stream)
D codec2 codec2 .c2 demuxer
D codec2raw raw codec2 demuxer
D dfpwm raw DFPWM1a
D dnxhd raw DNxHD (SMPTE VC-3)
D dts raw DTS
D dtshd raw DTS-HD
D eac3 raw E-AC-3
D f32be PCM 32-bit floating-point big-endian
D f32le PCM 32-bit floating-point little-endian
D f64be PCM 64-bit floating-point big-endian
D f64le PCM 64-bit floating-point little-endian
D ffmetadata FFmpeg metadata in text
D flac raw FLAC
D flv FLV (Flash Video)
D g722 raw G.722
D g723_1 G.723.1
D g726 raw big-endian G.726 ("left aligned")
D g726le raw little-endian G.726 ("right aligned")
D g728 raw G.728
D g729 G.729 raw format demuxer
D gif CompuServe Graphics Interchange Format (GIF)
D gif_pipe piped gif sequence
D gsm raw GSM
D h261 raw H.261
D h263 raw H.263
D h264 raw H.264 video
D ico Microsoft Windows ICO
D iff IFF (Interchange File Format)
D image2 image2 sequence
D image2pipe piped image2 sequence
D jpeg_pipe piped jpeg sequence
D jpegxl_anim Animated JPEG XL
D libopenmpt Tracker formats (libopenmpt)
D m4v raw MPEG-4 video
D matroska,webm Matroska / WebM
D mov,mp4,m4a,3gp,3g2,mj2 QuickTime / MOV
D mp3 MP2/3 (MPEG audio layer 2/3)
D mpc Musepack
D mpc8 Musepack SV8
D mpeg MPEG-PS (MPEG-2 Program Stream)
D mpegts MPEG-TS (MPEG-2 Transport Stream)
D mpegtsraw raw MPEG-TS (MPEG-2 Transport Stream)
D mpegvideo raw MPEG video
D mulaw PCM mu-law
D nut NUT
D ogg Ogg
D png_pipe piped png sequence
D rm RealMedia
D s16be PCM signed 16-bit big-endian
D s16le PCM signed 16-bit little-endian
D s24be PCM signed 24-bit big-endian
D s24le PCM signed 24-bit little-endian
D s32be PCM signed 32-bit big-endian
D s32le PCM signed 32-bit little-endian
D s337m SMPTE 337M
D s8 PCM signed 8-bit
D sox SoX (Sound eXchange) native
D swf SWF (ShockWave Flash)
D tak raw TAK
D tta TTA (True Audio)
D u16be PCM unsigned 16-bit big-endian
D u16le PCM unsigned 16-bit little-endian
D u24be PCM unsigned 24-bit big-endian
D u24le PCM unsigned 24-bit little-endian
D u32be PCM unsigned 32-bit big-endian
D u32le PCM unsigned 32-bit little-endian
D u8 PCM unsigned 8-bit
D vc1 raw VC-1
D wav WAV / WAVE (Waveform Audio)
D wv WavPack
Devices:
D. = Demuxing supported
.E = Muxing supported
---
Decoders:
V..... = Video
A..... = Audio
S..... = Subtitle
.F.... = Frame-level multithreading
..S... = Slice-level multithreading
...X.. = Codec is experimental
....B. = Supports draw_horiz_band
.....D = Supports direct rendering method 1
------
VF...D apng APNG (Animated Portable Network Graphics) image
V..... libdav1d dav1d AV1 decoder by VideoLAN (codec av1)
V....D bmp BMP (Windows and OS/2 bitmap)
V.S..D dds DirectDraw Surface image decoder
VFS..D dnxhd VC3/DNxHD
VF...D dpx DPX (Digital Picture Exchange) image
VFS..D dxv Resolume DXV
VFS..D exr OpenEXR image
VFS..D ffv1 FFmpeg video codec #1
VF..BD ffvhuff Huffyuv FFmpeg variant
V...BD flv FLV / Sorenson Spark / Sorenson H.263 (Flash Video) (codec flv1)
V....D gif GIF (Graphics Interchange Format)
V...BD h263 H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2
V...BD h263i Intel H.263
V...BD h263p H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2
VFS..D h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
VF...D hdr HDR (Radiance RGBE format) image
VF..BD huffyuv Huffyuv / HuffYUV
VF..BD hymt HuffYUV MT
V....D libjxl libjxl JPEG XL (codec jpegxl)
V....D libjxl_anim libjxl JPEG XL animated (codec jpegxl_anim)
V....D mjpeg MJPEG (Motion JPEG)
V.S.BD mpeg1video MPEG-1 video
V.S.BD mpeg2video MPEG-2 video
V.S.BD mpegvideo MPEG-1 video (codec mpeg2video)
VF..BD mpeg4 MPEG-4 part 2
V...BD msmpeg4v1 MPEG-4 part 2 Microsoft variant version 1
V...BD msmpeg4v2 MPEG-4 part 2 Microsoft variant version 2
V...BD msmpeg4 MPEG-4 part 2 Microsoft variant version 3 (codec msmpeg4v3)
V....D msrle Microsoft RLE
V....D pbm PBM (Portable BitMap) image
V....D pcx PC Paintbrush PCX image
V....D pgm PGM (Portable GrayMap) image
V....D pgmyuv PGMYUV (Portable GrayMap YUV) image
VF...D png PNG (Portable Network Graphics) image
V....D ppm PPM (Portable PixelMap) image
VF...D qoi QOI (Quite OK Image format) image
V..... rawvideo raw video
V....D rv10 RealVideo 1.0
V....D rv20 RealVideo 2.0
VF...D rv30 RealVideo 3.0
VF...D rv40 RealVideo 4.0
V.S..D rv60 RealVideo 6.0
V....D targa Truevision Targa image
V....D targa_y216 Pinnacle TARGA CineWave YUV16
VF...D tiff TIFF image
VF...D utvideo Ut Video
VFS..D v410 Uncompressed 4:4:4 10-bit
V....D vc1 SMPTE VC-1
V....D vnull null video
V....D vp7 On2 VP7
VFS..D vp8 On2 VP8
VFS..D vp9 Google VP9
VF...D webp WebP image
V...BD wmv1 Windows Media Video 7
V...BD wmv2 Windows Media Video 8
V....D wmv3 Windows Media Video 9
V....D wmv3image Windows Media Video 9 Image
V..... wrapped_avframe AVPacket to AVFrame passthrough
V....D xbm XBM (X BitMap) image
V....D xpm XPM (X PixMap) image
V....D yuv4 Uncompressed packed 4:2:0
V....D zmbv Zip Motion Blocks Video
A....D aac AAC (Advanced Audio Coding)
A....D aac_fixed AAC (Advanced Audio Coding) (codec aac)
A....D aac_latm AAC LATM (Advanced Audio Coding LATM syntax)
A....D ac3 ATSC A/52A (AC-3)
A....D ac3_fixed ATSC A/52A (AC-3) (codec ac3)
A....D adpcm_4xm ADPCM 4X Movie
A....D adpcm_adx SEGA CRI ADX ADPCM
A....D adpcm_afc ADPCM Nintendo Gamecube AFC
A....D adpcm_aica ADPCM Yamaha AICA
A....D adpcm_circus ADPCM Circus
A....D g722 G.722 ADPCM (codec adpcm_g722)
A....D g726 G.726 ADPCM (codec adpcm_g726)
A....D g726le G.726 ADPCM little-endian (codec adpcm_g726le)
A....D adpcm_ima_qt ADPCM IMA QuickTime
A....D adpcm_ima_wav ADPCM IMA WAV
A....D adpcm_ima_ws ADPCM IMA Westwood
A....D adpcm_ima_xbox ADPCM IMA Xbox
A....D adpcm_ms ADPCM Microsoft
A....D adpcm_n64 ADPCM Silicon Graphics N64
A....D adpcm_psx ADPCM Playstation
A....D adpcm_psxc ADPCM Playstation C
A....D adpcm_sanyo ADPCM Sanyo
A....D adpcm_sbpro_2 ADPCM Sound Blaster Pro 2-bit
A....D adpcm_sbpro_3 ADPCM Sound Blaster Pro 2.6-bit
A....D adpcm_sbpro_4 ADPCM Sound Blaster Pro 4-bit
A....D adpcm_swf ADPCM Shockwave Flash
A....D adpcm_thp ADPCM Nintendo THP
A....D adpcm_thp_le ADPCM Nintendo THP (little-endian)
A....D adpcm_xa ADPCM CDROM XA
A....D adpcm_yamaha ADPCM Yamaha
AF...D alac ALAC (Apple Lossless Audio Codec)
A....D amrnb AMR-NB (Adaptive Multi-Rate NarrowBand) (codec amr_nb)
A....D amrwb AMR-WB (Adaptive Multi-Rate WideBand) (codec amr_wb)
A....D anull null audio
A....D ape Monkey's Audio
A....D atrac1 ATRAC1 (Adaptive TRansform Acoustic Coding)
A....D atrac3 ATRAC3 (Adaptive TRansform Acoustic Coding 3)
A....D atrac3al ATRAC3 AL (Adaptive TRansform Acoustic Coding 3 Advanced Lossless)
A....D atrac3plus ATRAC3+ (Adaptive TRansform Acoustic Coding 3+) (codec atrac3p)
A....D atrac3plusal ATRAC3+ AL (Adaptive TRansform Acoustic Coding 3+ Advanced Lossless) (codec atrac3pal)
A....D atrac9 ATRAC9 (Adaptive TRansform Acoustic Coding 9)
A....D on2avc On2 Audio for Video Codec (codec avc)
A....D dfpwm DFPWM1a audio
A....D dst DST (Digital Stream Transfer)
A....D dca DCA (DTS Coherent Acoustics) (codec dts)
A....D dvaudio Ulead DV Audio
A....D eac3 ATSC A/52B (AC-3, E-AC-3)
AF...D flac FLAC (Free Lossless Audio Codec)
A....D g723_1 G.723.1
A....D g728 G.728)
A....D g729 G.729
A....D gsm GSM
A....D gsm_ms GSM Microsoft variant
A....D mp1 MP1 (MPEG audio layer 1)
A....D mp1float MP1 (MPEG audio layer 1) (codec mp1)
A....D mp2 MP2 (MPEG audio layer 2)
A....D mp2float MP2 (MPEG audio layer 2) (codec mp2)
A....D mp3float MP3 (MPEG audio layer 3) (codec mp3)
A....D mp3 MP3 (MPEG audio layer 3)
A....D mp3adufloat ADU (Application Data Unit) MP3 (MPEG audio layer 3) (codec mp3adu)
A....D mp3adu ADU (Application Data Unit) MP3 (MPEG audio layer 3)
A....D mp3on4float MP3onMP4 (codec mp3on4)
A....D mp3on4 MP3onMP4
A....D als MPEG-4 Audio Lossless Coding (ALS) (codec mp4als)
A....D mpc7 Musepack SV7 (codec musepack7)
A....D mpc8 Musepack SV8 (codec musepack8)
A....D libopus libopus Opus (codec opus)
A....D pcm_alaw PCM A-law / G.711 A-law
A....D pcm_bluray PCM signed 16|20|24-bit big-endian for Blu-ray media
A....D pcm_dvd PCM signed 16|20|24-bit big-endian for DVD media
A....D pcm_f16le PCM 16.8 floating point little-endian
A....D pcm_f24le PCM 24.0 floating point little-endian
A....D pcm_f32be PCM 32-bit floating point big-endian
A....D pcm_f32le PCM 32-bit floating point little-endian
A....D pcm_f64be PCM 64-bit floating point big-endian
A....D pcm_f64le PCM 64-bit floating point little-endian
A....D pcm_mulaw PCM mu-law / G.711 mu-law
A....D pcm_s16be PCM signed 16-bit big-endian
A....D pcm_s16be_planar PCM signed 16-bit big-endian planar
A....D pcm_s16le PCM signed 16-bit little-endian
A....D pcm_s16le_planar PCM signed 16-bit little-endian planar
A....D pcm_s24be PCM signed 24-bit big-endian
A....D pcm_s24le PCM signed 24-bit little-endian
A....D pcm_s24le_planar PCM signed 24-bit little-endian planar
A....D pcm_s32be PCM signed 32-bit big-endian
A....D pcm_s32le PCM signed 32-bit little-endian
A....D pcm_s32le_planar PCM signed 32-bit little-endian planar
A....D pcm_s64be PCM signed 64-bit big-endian
A....D pcm_s64le PCM signed 64-bit little-endian
A....D pcm_s8 PCM signed 8-bit
A....D pcm_s8_planar PCM signed 8-bit planar
A....D pcm_u16be PCM unsigned 16-bit big-endian
A....D pcm_u16le PCM unsigned 16-bit little-endian
A....D pcm_u24be PCM unsigned 24-bit big-endian
A....D pcm_u24le PCM unsigned 24-bit little-endian
A....D pcm_u32be PCM unsigned 32-bit big-endian
A....D pcm_u32le PCM unsigned 32-bit little-endian
A....D pcm_u8 PCM unsigned 8-bit
A....D qcelp QCELP / PureVoice
A....D qoa QOA (Quite OK Audio)
A....D real_144 RealAudio 1.0 (14.4K) (codec ra_144)
A....D real_288 RealAudio 2.0 (28.8K) (codec ra_288)
A....D ralf RealAudio Lossless
A....D sipr RealAudio SIPR / ACELP.NET
A....D smackaud Smacker audio (codec smackaudio)
A....D speex Speex
AF...D tak TAK (Tom's lossless Audio Kompressor)
A....D truehd TrueHD
AF...D tta TTA (True Audio)
A....D vorbis Vorbis
A..... libvorbis libvorbis (codec vorbis)
A....D wavesynth Wave synthesis pseudo-codec
AFS..D wavpack WavPack
A....D wmalossless Windows Media Audio Lossless
A....D wmapro Windows Media Audio 9 Professional
A....D wmav1 Windows Media Audio 1
A....D wmav2 Windows Media Audio 2
Encoders:
V..... = Video
A..... = Audio
S..... = Subtitle
.F.... = Frame-level multithreading
..S... = Slice-level multithreading
...X.. = Codec is experimental
....B. = Supports draw_horiz_band
.....D = Supports direct rendering method 1
------
V....D libjxl libjxl JPEG XL (codec jpegxl)
VFS..D mjpeg MJPEG (Motion JPEG)
VF...D png PNG (Portable Network Graphics) image
VF...D rawvideo raw video
V..... vnull null video
V....D libwebp libwebp WebP image (codec webp)
V..... wrapped_avframe AVFrame to AVPacket passthrough
A....D flac FLAC (Free Lossless Audio Codec)
A....D libmp3lame libmp3lame MP3 (MPEG audio layer 3) (codec mp3)
A....D libopus libopus Opus (codec opus)
A....D pcm_f32le PCM 32-bit floating point little-endian
A....D pcm_s16le PCM signed 16-bit little-endian
A....D pcm_s16le_planar PCM signed 16-bit little-endian planar
Filters:
T.. = Timeline support
.S. = Slice threading
A = Audio input/output
V = Video input/output
N = Dynamic number and/or type of input/output
| = Source or sink filter
------
.. aformat A->A Convert the input audio to one of the specified formats.
.. amerge N->A Merge two or more audio streams into a single multi-channel stream.
.. amix N->A Audio mixing.
.. anull A->A Pass the source unchanged to the output.
.. aresample A->A Resample audio data.
.. asplit A->N Pass on the audio input to N audio outputs.
.. atrim A->A Pick one continuous section from the input, drop the rest.
.. compand A->A Compress or expand audio dynamic range.
T. volume A->A Change input volume.
.. anoisesrc |->A Generate a noise audio signal.
TS convolution V->V Apply convolution filter.
.. crop V->V Crop the input video.
.. format V->V Convert the input video to one of the specified pixel formats.
TS hflip V->V Horizontally flip the input video.
.. null V->V Pass the source unchanged to the output.
TS rotate V->V Rotate the input image.
.. scale V->V Scale the input video size and/or convert the image format.
.. setsar V->V Set the pixel sample aspect ratio.
.S transpose V->V Transpose input video.
.. trim V->V Pick one continuous section from the input, drop the rest.
T. vflip V->V Flip the input video vertically.
.S showspectrumpic A->V Convert input audio to a spectrum video output single picture.
.. showwavespic A->V Convert input audio to a video output single picture.
.. abuffer |->A Buffer audio frames, and make them accessible to the filterchain.
.. buffer |->V Buffer video frames, and make them accessible to the filterchain.
.. abuffersink A->| Buffer audio frames, and make them available to the end of the filter graph.
.. buffersink V->| Buffer video frames, and make them available to the end of the filter graph.
Pixel formats:
I.... = Supported Input format for conversion
.O... = Supported Output format for conversion
..H.. = Hardware accelerated format
...P. = Paletted format
....B = Bitstream format
FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL BIT_DEPTHS
-----
IO... yuv420p 3 12 8-8-8
IO... yuyv422 3 16 8-8-8
IO... rgb24 3 24 8-8-8
IO... bgr24 3 24 8-8-8
IO... yuv422p 3 16 8-8-8
IO... yuv444p 3 24 8-8-8
IO... yuv410p 3 9 8-8-8
IO... yuv411p 3 12 8-8-8
IO... gray 1 8 8
IO..B monow 1 1 1
IO..B monob 1 1 1
I..P. pal8 1 8 8
IO... yuvj420p 3 12 8-8-8
IO... yuvj422p 3 16 8-8-8
IO... yuvj444p 3 24 8-8-8
IO... uyvy422 3 16 8-8-8
I.... uyyvyy411 3 12 8-8-8
IO... bgr8 3 8 3-3-2
.O..B bgr4 3 4 1-2-1
IO... bgr4_byte 3 4 1-2-1
IO... rgb8 3 8 3-3-2
.O..B rgb4 3 4 1-2-1
IO... rgb4_byte 3 4 1-2-1
IO... nv12 3 12 8-8-8
IO... nv21 3 12 8-8-8
IO... argb 4 32 8-8-8-8
IO... rgba 4 32 8-8-8-8
IO... abgr 4 32 8-8-8-8
IO... bgra 4 32 8-8-8-8
IO... gray16be 1 16 16
IO... gray16le 1 16 16
IO... yuv440p 3 16 8-8-8
IO... yuvj440p 3 16 8-8-8
IO... yuva420p 4 20 8-8-8-8
IO... rgb48be 3 48 16-16-16
IO... rgb48le 3 48 16-16-16
IO... rgb565be 3 16 5-6-5
IO... rgb565le 3 16 5-6-5
IO... rgb555be 3 15 5-5-5
IO... rgb555le 3 15 5-5-5
IO... bgr565be 3 16 5-6-5
IO... bgr565le 3 16 5-6-5
IO... bgr555be 3 15 5-5-5
IO... bgr555le 3 15 5-5-5
..H.. vaapi 0 0 0
IO... yuv420p16le 3 24 16-16-16
IO... yuv420p16be 3 24 16-16-16
IO... yuv422p16le 3 32 16-16-16
IO... yuv422p16be 3 32 16-16-16
IO... yuv444p16le 3 48 16-16-16
IO... yuv444p16be 3 48 16-16-16
..H.. dxva2_vld 0 0 0
IO... rgb444le 3 12 4-4-4
IO... rgb444be 3 12 4-4-4
IO... bgr444le 3 12 4-4-4
IO... bgr444be 3 12 4-4-4
IO... ya8 2 16 8-8
IO... bgr48be 3 48 16-16-16
IO... bgr48le 3 48 16-16-16
IO... yuv420p9be 3 13 9-9-9
IO... yuv420p9le 3 13 9-9-9
IO... yuv420p10be 3 15 10-10-10
IO... yuv420p10le 3 15 10-10-10
IO... yuv422p10be 3 20 10-10-10
IO... yuv422p10le 3 20 10-10-10
IO... yuv444p9be 3 27 9-9-9
IO... yuv444p9le 3 27 9-9-9
IO... yuv444p10be 3 30 10-10-10
IO... yuv444p10le 3 30 10-10-10
IO... yuv422p9be 3 18 9-9-9
IO... yuv422p9le 3 18 9-9-9
IO... gbrp 3 24 8-8-8
IO... gbrp9be 3 27 9-9-9
IO... gbrp9le 3 27 9-9-9
IO... gbrp10be 3 30 10-10-10
IO... gbrp10le 3 30 10-10-10
IO... gbrp16be 3 48 16-16-16
IO... gbrp16le 3 48 16-16-16
IO... yuva422p 4 24 8-8-8-8
IO... yuva444p 4 32 8-8-8-8
IO... yuva420p9be 4 22 9-9-9-9
IO... yuva420p9le 4 22 9-9-9-9
IO... yuva422p9be 4 27 9-9-9-9
IO... yuva422p9le 4 27 9-9-9-9
IO... yuva444p9be 4 36 9-9-9-9
IO... yuva444p9le 4 36 9-9-9-9
IO... yuva420p10be 4 25 10-10-10-10
IO... yuva420p10le 4 25 10-10-10-10
IO... yuva422p10be 4 30 10-10-10-10
IO... yuva422p10le 4 30 10-10-10-10
IO... yuva444p10be 4 40 10-10-10-10
IO... yuva444p10le 4 40 10-10-10-10
IO... yuva420p16be 4 40 16-16-16-16
IO... yuva420p16le 4 40 16-16-16-16
IO... yuva422p16be 4 48 16-16-16-16
IO... yuva422p16le 4 48 16-16-16-16
IO... yuva444p16be 4 64 16-16-16-16
IO... yuva444p16le 4 64 16-16-16-16
..H.. vdpau 0 0 0
IO... xyz12le 3 36 12-12-12
IO... xyz12be 3 36 12-12-12
IO... nv16 3 16 8-8-8
IO... nv20le 3 20 10-10-10
IO... nv20be 3 20 10-10-10
IO... rgba64be 4 64 16-16-16-16
IO... rgba64le 4 64 16-16-16-16
IO... bgra64be 4 64 16-16-16-16
IO... bgra64le 4 64 16-16-16-16
IO... yvyu422 3 16 8-8-8
IO... ya16be 2 32 16-16
IO... ya16le 2 32 16-16
IO... gbrap 4 32 8-8-8-8
IO... gbrap16be 4 64 16-16-16-16
IO... gbrap16le 4 64 16-16-16-16
..H.. qsv 0 0 0
..H.. mmal 0 0 0
..H.. d3d11va_vld 0 0 0
..H.. cuda 0 0 0
IO... 0rgb 3 24 8-8-8
IO... rgb0 3 24 8-8-8
IO... 0bgr 3 24 8-8-8
IO... bgr0 3 24 8-8-8
IO... yuv420p12be 3 18 12-12-12
IO... yuv420p12le 3 18 12-12-12
IO... yuv420p14be 3 21 14-14-14
IO... yuv420p14le 3 21 14-14-14
IO... yuv422p12be 3 24 12-12-12
IO... yuv422p12le 3 24 12-12-12
IO... yuv422p14be 3 28 14-14-14
IO... yuv422p14le 3 28 14-14-14
IO... yuv444p12be 3 36 12-12-12
IO... yuv444p12le 3 36 12-12-12
IO... yuv444p14be 3 42 14-14-14
IO... yuv444p14le 3 42 14-14-14
IO... gbrp12be 3 36 12-12-12
IO... gbrp12le 3 36 12-12-12
IO... gbrp14be 3 42 14-14-14
IO... gbrp14le 3 42 14-14-14
IO... yuvj411p 3 12 8-8-8
I.... bayer_bggr8 3 8 2-4-2
I.... bayer_rggb8 3 8 2-4-2
I.... bayer_gbrg8 3 8 2-4-2
I.... bayer_grbg8 3 8 2-4-2
I.... bayer_bggr16le 3 16 4-8-4
I.... bayer_bggr16be 3 16 4-8-4
I.... bayer_rggb16le 3 16 4-8-4
I.... bayer_rggb16be 3 16 4-8-4
I.... bayer_gbrg16le 3 16 4-8-4
I.... bayer_gbrg16be 3 16 4-8-4
I.... bayer_grbg16le 3 16 4-8-4
I.... bayer_grbg16be 3 16 4-8-4
IO... yuv440p10le 3 20 10-10-10
IO... yuv440p10be 3 20 10-10-10
IO... yuv440p12le 3 24 12-12-12
IO... yuv440p12be 3 24 12-12-12
IO... ayuv64le 4 64 16-16-16-16
IO... ayuv64be 4 64 16-16-16-16
..H.. videotoolbox_vld 0 0 0
IO... p010le 3 15 10-10-10
IO... p010be 3 15 10-10-10
IO... gbrap12be 4 48 12-12-12-12
IO... gbrap12le 4 48 12-12-12-12
IO... gbrap10be 4 40 10-10-10-10
IO... gbrap10le 4 40 10-10-10-10
..H.. mediacodec 0 0 0
IO... gray12be 1 12 12
IO... gray12le 1 12 12
IO... gray10be 1 10 10
IO... gray10le 1 10 10
IO... p016le 3 24 16-16-16
IO... p016be 3 24 16-16-16
..H.. d3d11 0 0 0
IO... gray9be 1 9 9
IO... gray9le 1 9 9
IO... gbrpf32be 3 96 32-32-32
IO... gbrpf32le 3 96 32-32-32
IO... gbrapf32be 4 128 32-32-32-32
IO... gbrapf32le 4 128 32-32-32-32
..H.. drm_prime 0 0 0
..H.. opencl 0 0 0
IO... gray14be 1 14 14
IO... gray14le 1 14 14
IO... grayf32be 1 32 32
IO... grayf32le 1 32 32
IO... yuva422p12be 4 36 12-12-12-12
IO... yuva422p12le 4 36 12-12-12-12
IO... yuva444p12be 4 48 12-12-12-12
IO... yuva444p12le 4 48 12-12-12-12
IO... nv24 3 24 8-8-8
IO... nv42 3 24 8-8-8
..H.. vulkan 0 0 0
..... y210be 3 20 10-10-10
IO... y210le 3 20 10-10-10
IO... x2rgb10le 3 30 10-10-10
..... x2rgb10be 3 30 10-10-10
IO... x2bgr10le 3 30 10-10-10
..... x2bgr10be 3 30 10-10-10
IO... p210be 3 20 10-10-10
IO... p210le 3 20 10-10-10
IO... p410be 3 30 10-10-10
IO... p410le 3 30 10-10-10
IO... p216be 3 32 16-16-16
IO... p216le 3 32 16-16-16
IO... p416be 3 48 16-16-16
IO... p416le 3 48 16-16-16
IO... vuya 4 32 8-8-8-8
I.... rgbaf16be 4 64 16-16-16-16
I.... rgbaf16le 4 64 16-16-16-16
IO... vuyx 3 24 8-8-8
IO... p012le 3 18 12-12-12
IO... p012be 3 18 12-12-12
..... y212be 3 24 12-12-12
IO... y212le 3 24 12-12-12
....B xv30be 3 30 10-10-10
IO... xv30le 3 30 10-10-10
IO... xv36be 3 36 12-12-12
IO... xv36le 3 36 12-12-12
I.... rgbf32be 3 96 32-32-32
I.... rgbf32le 3 96 32-32-32
..... rgbaf32be 4 128 32-32-32-32
..... rgbaf32le 4 128 32-32-32-32
IO... p212be 3 24 12-12-12
IO... p212le 3 24 12-12-12
IO... p412be 3 36 12-12-12
IO... p412le 3 36 12-12-12
IO... gbrap14be 4 56 14-14-14-14
IO... gbrap14le 4 56 14-14-14-14
..H.. d3d12 0 0 0
IO... ayuv 4 32 8-8-8-8
IO... uyva 4 32 8-8-8-8
IO... vyu444 3 24 8-8-8
....B v30xbe 3 30 10-10-10
IO... v30xle 3 30 10-10-10
I.... rgbf16be 3 48 16-16-16
I.... rgbf16le 3 48 16-16-16
..... rgba128be 4 128 32-32-32-32
..... rgba128le 4 128 32-32-32-32
..... rgb96be 3 96 32-32-32
..... rgb96le 3 96 32-32-32
..... y216be 3 32 16-16-16
IO... y216le 3 32 16-16-16
IO... xv48be 3 48 16-16-16
IO... xv48le 3 48 16-16-16
I.... gbrpf16be 3 48 16-16-16
I.... gbrpf16le 3 48 16-16-16
I.... gbrapf16be 4 64 16-16-16-16
I.... gbrapf16le 4 64 16-16-16-16
I.... grayf16be 1 16 16
I.... grayf16le 1 16 16
..H.. amf 0 0 0
..... gray32be 1 32 32
..... gray32le 1 32 32
I.... yaf32be 2 64 32-32
I.... yaf32le 2 64 32-32
I.... yaf16be 2 32 16-16
I.... yaf16le 2 32 16-16
..... gbrap32be 4 128 32-32-32-32
..... gbrap32le 4 128 32-32-32-32
IO... yuv444p10msbbe 3 30 10-10-10
IO... yuv444p10msble 3 30 10-10-10
IO... yuv444p12msbbe 3 36 12-12-12
IO... yuv444p12msble 3 36 12-12-12
IO... gbrp10msbbe 3 30 10-10-10
IO... gbrp10msble 3 30 10-10-10
IO... gbrp12msbbe 3 36 12-12-12
IO... gbrp12msble 3 36 12-12-12
..H.. ohcodec 0 0 0
Individual channels:
NAME DESCRIPTION
FL front left
FR front right
FC front center
LFE low frequency
BL back left
BR back right
FLC front left-of-center
FRC front right-of-center
BC back center
SL side left
SR side right
TC top center
TFL top front left
TFC top front center
TFR top front right
TBL top back left
TBC top back center
TBR top back right
DL downmix left
DR downmix right
WL wide left
WR wide right
SDL surround direct left
SDR surround direct right
LFE2 low frequency 2
TSL top side left
TSR top side right
BFC bottom front center
BFL bottom front left
BFR bottom front right
SSL side surround left
SSR side surround right
TTL top surround left
TTR top surround right
BIL binaural left
BIR binaural right
Standard channel layouts:
NAME DECOMPOSITION
mono FC
stereo FL+FR
2.1 FL+FR+LFE
3.0 FL+FR+FC
3.0(back) FL+FR+BC
4.0 FL+FR+FC+BC
quad FL+FR+BL+BR
quad(side) FL+FR+SL+SR
3.1 FL+FR+FC+LFE
5.0 FL+FR+FC+BL+BR
5.0(side) FL+FR+FC+SL+SR
4.1 FL+FR+FC+LFE+BC
5.1 FL+FR+FC+LFE+BL+BR
5.1(side) FL+FR+FC+LFE+SL+SR
6.0 FL+FR+FC+BC+SL+SR
6.0(front) FL+FR+FLC+FRC+SL+SR
3.1.2 FL+FR+FC+LFE+TFL+TFR
hexagonal FL+FR+FC+BL+BR+BC
6.1 FL+FR+FC+LFE+BC+SL+SR
6.1(back) FL+FR+FC+LFE+BL+BR+BC
6.1(front) FL+FR+LFE+FLC+FRC+SL+SR
7.0 FL+FR+FC+BL+BR+SL+SR
7.0(front) FL+FR+FC+FLC+FRC+SL+SR
7.1 FL+FR+FC+LFE+BL+BR+SL+SR
7.1(wide) FL+FR+FC+LFE+BL+BR+FLC+FRC
7.1(wide-side) FL+FR+FC+LFE+FLC+FRC+SL+SR
5.1.2 FL+FR+FC+LFE+SL+SR+TFL+TFR
5.1.2(back) FL+FR+FC+LFE+BL+BR+TFL+TFR
octagonal FL+FR+FC+BL+BR+BC+SL+SR
cube FL+FR+BL+BR+TFL+TFR+TBL+TBR
5.1.4 FL+FR+FC+LFE+SL+SR+TFL+TFR+TBL+TBR
7.1.2 FL+FR+FC+LFE+BL+BR+SL+SR+TFL+TFR
7.1.4 FL+FR+FC+LFE+BL+BR+SL+SR+TFL+TFR+TBL+TBR
7.2.3 FL+FR+FC+LFE+BL+BR+SL+SR+TFL+TFR+TBC+LFE2
9.1.4 FL+FR+FC+LFE+BL+BR+FLC+FRC+SL+SR+TFL+TFR+TBL+TBR
9.1.6 FL+FR+FC+LFE+BL+BR+FLC+FRC+SL+SR+TFL+TFR+TBL+TBR+TSL+TSR
hexadecagonal FL+FR+FC+BL+BR+BC+SL+SR+TFL+TFC+TFR+TBL+TBC+TBR+WL+WR
binaural BIL+BIR
downmix DL+DR
22.2 FL+FR+FC+LFE+BL+BR+FLC+FRC+BC+SL+SR+TC+TFL+TFC+TFR+TBL+TBC+TBR+LFE2+TSL+TSR+BFC+BFL+BFR
name depth
u8 8
s16 16
s32 32
flt 32
dbl 64
u8p 8
s16p 16
s32p 32
fltp 32
dblp 64
s64 64
s64p 64
Bitstream filters:
aac_adtstoasc
ahx_to_mp2
apv_metadata
av1_frame_merge
av1_frame_split
av1_metadata
chomp
dump_extra
dca_core
dovi_rpu
dv_error_marker
eac3_core
eia608_to_smpte436m
evc_frame_merge
extract_extradata
filter_units
h264_metadata
h264_mp4toannexb
h264_redundant_pps
hapqa_extract
imxdump
lcevc_metadata
media100_to_mjpegb
mjpeg2jpeg
mjpegadump
mpeg2_metadata
mpeg4_unpack_bframes
mov2textsub
noise
null
opus_metadata
pcm_rechunk
pgs_frame_merge
prores_metadata
remove_extra
setts
showinfo
smpte436m_to_eia608
text2movsub
trace_headers
truehd_core
vp9_metadata
vp9_raw_reorder
vp9_superframe
vp9_superframe_split
@@ -0,0 +1,59 @@
remove all advanced aac features, leaving only aac-lc which is
no longer patent-encumbered in any relevant parts of the world
( and 99% of all aac files are lc-aac anyways so that's fine )
diff --git a/libavcodec/aac/aacdec.c b/libavcodec/aac/aacdec.c
index b8d53036d4..054c46f84e 100644
--- a/libavcodec/aac/aacdec.c
+++ b/libavcodec/aac/aacdec.c
@@ -880,9 +880,7 @@ static int decode_pce(AVCodecContext *avctx, MPEG4AudioConfig *m4ac,
*/
static int decode_ga_specific_config(AACDecContext *ac, AVCodecContext *avctx,
- GetBitContext *gb,
- int get_bit_alignment,
- MPEG4AudioConfig *m4ac,
- int channel_config)
+ GetBitContext *gb, int get_bit_alignment, MPEG4AudioConfig *m4ac, int channel_config)
{
+ if (m4ac->sbr > 0) return AVERROR_DECODER_NOT_FOUND;
int extension_flag, ret, ep_config, res_flags;
uint8_t layout_map[MAX_ELEM_ID*4][3];
@@ -961,8 +959,7 @@ static int decode_ga_specific_config(AACDecContext *ac, AVCodecContext *avctx,
static int decode_eld_specific_config(AACDecContext *ac, AVCodecContext *avctx,
- GetBitContext *gb,
- MPEG4AudioConfig *m4ac,
- int channel_config)
+ GetBitContext *gb, MPEG4AudioConfig *m4ac, int channel_config)
{
+ return AVERROR_DECODER_NOT_FOUND; // kill ELD support
int ret, ep_config, res_flags;
uint8_t layout_map[MAX_ELEM_ID*4][3];
@@ -1070,5 +1067,4 @@ static int decode_audio_specific_config_gb(AACDecContext *ac,
case AOT_AAC_LTP:
case AOT_ER_AAC_LC:
- case AOT_ER_AAC_LD:
if ((ret = decode_ga_specific_config(ac, avctx, gb, get_bit_alignment,
&oc->m4ac, m4ac->chan_config)) < 0)
@@ -1948,4 +1944,5 @@ static int decode_extension_payload(AACDecContext *ac, GetBitContext *gb, int cn
crc_flag++;
case EXT_SBR_DATA:
+ return res; // kill HE/SBR support
if (!che) {
av_log(ac->avctx, AV_LOG_ERROR, "SBR was found before the first channel element.\n");
@@ -2087,4 +2084,5 @@ static void spectral_to_sample(AACDecContext *ac, int samples)
}
if (ac->oc[1].m4ac.sbr > 0) {
+ exit(1); // kill HE/SBR support
ac->proc.sbr_apply(ac, che, type,
che->ch[0].output,
diff --git a/libavcodec/aacsbr_template.c b/libavcodec/aacsbr_template.c
index 31d2d844c4..b55f93752a 100644
--- a/libavcodec/aacsbr_template.c
+++ b/libavcodec/aacsbr_template.c
@@ -639,4 +639,5 @@ static int read_sbr_grid(AACDecContext *ac, SpectralBandReplication *sbr,
GetBitContext *gb, SBRData *ch_data)
{
+ exit(1); // kill SBR support
int i;
int bs_pointer = 0;
@@ -0,0 +1,26 @@
// just the signatures from the original file; all bodies/logic removed
#include <stdint.h>
#include "libavutil/common.h"
#include "libavutil/mathematics.h"
#include "libavutil/mem_internal.h"
#include "aacps.h"
#if USE_FIXED
#include "aacps_fixed_tablegen.h"
#else
#include "libavutil/internal.h"
#include "aacps_tablegen.h"
#endif /* USE_FIXED */
static void hybrid_analysis(PSDSPContext *dsp, INTFLOAT out[91][32][2],
INTFLOAT in[5][44][2], INTFLOAT L[2][38][64],
int is34, int len) {}
static void hybrid_synthesis(PSDSPContext *dsp, INTFLOAT out[2][38][64],
INTFLOAT in[91][32][2], int is34, int len) {}
static void decorrelation(PSContext *ps, INTFLOAT (*out)[32][2], const INTFLOAT (*s)[32][2], int is34) {}
int AAC_RENAME(ff_ps_apply)(PSContext *ps, INTFLOAT L[2][38][64], INTFLOAT R[2][38][64], int top) { return 0; }
av_cold void AAC_RENAME(ff_ps_init)(void) {}
@@ -0,0 +1,41 @@
// just the signatures from the original file; all bodies/logic removed
#define USE_FIXED 0
#include "aac.h"
#include "sbr.h"
#include "aacsbr.h"
#include "aacsbrdata.h"
#include "aacps.h"
#include "sbrdsp.h"
#include "libavutil/internal.h"
#include "libavutil/intfloat.h"
#include "libavutil/libm.h"
#include "libavutil/avassert.h"
#include "libavutil/mem_internal.h"
#include <stdint.h>
#include <float.h>
#include <math.h>
static void aacsbr_func_ptr_init(AACSBRContext *c);
static void make_bands(int16_t* bands, int start, int stop, int num_bands) {}
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac) {}
static void sbr_hf_inverse_filter(SBRDSPContext *dsp,
float (*alpha0)[2], float (*alpha1)[2],
const float X_low[32][40][2], int k0) {}
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data) {}
static void sbr_gain_calc(SpectralBandReplication *sbr,
SBRData *ch_data, const int e_a[2]) {}
static void sbr_hf_assemble(float Y1[38][64][2],
const float X_high[64][40][2],
SpectralBandReplication *sbr, SBRData *ch_data,
const int e_a[2]) {}
#include "aacsbr_template.c"
@@ -0,0 +1,45 @@
// just the signatures from the original file; all bodies/logic removed
#define USE_FIXED 1
#include "aac.h"
#include "sbr.h"
#include "aacsbr.h"
#include "aacsbrdata.h"
#include "aacps.h"
#include "sbrdsp.h"
#include "libavutil/internal.h"
#include "libavutil/libm.h"
#include "libavutil/avassert.h"
#include <stdint.h>
#include <float.h>
#include <math.h>
static void aacsbr_func_ptr_init(AACSBRContext *c);
static const int CONST_RECIP_LN2 = Q31(0.7);
static const int CONST_076923 = Q31(0.7);
static const int fixed_log_table[] = {Q31(0)};
static int fixed_log(int x) {return 1;}
static void make_bands(int16_t* bands, int start, int stop, int num_bands) {}
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac) {}
static void sbr_hf_inverse_filter(SBRDSPContext *dsp,
int (*alpha0)[2], int (*alpha1)[2],
const int X_low[32][40][2], int k0) {}
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data) {}
static void sbr_gain_calc(SpectralBandReplication *sbr,
SBRData *ch_data, const int e_a[2]) {}
static void sbr_hf_assemble(int Y1[38][64][2],
const int X_high[64][40][2],
SpectralBandReplication *sbr, SBRData *ch_data,
const int e_a[2]) {}
#include "aacsbr_template.c"
@@ -0,0 +1,16 @@
// just the signatures from the original file; all bodies/logic removed
#ifndef AVCODEC_AACSBRDATA_H
#define AVCODEC_AACSBRDATA_H
#include <stdint.h>
#include "libavutil/mem_internal.h"
#include "aac_defines.h"
static const int8_t sbr_offset[6][16] = {};
static const DECLARE_ALIGNED(32, INTFLOAT, sbr_qmf_window_ds)[320] = {};
static const DECLARE_ALIGNED(32, INTFLOAT, sbr_qmf_window_us)[640] = {};
#endif /* AVCODEC_AACSBRDATA_H */
+29
View File
@@ -0,0 +1,29 @@
#!/bin/bash
set -e
AVER=3.24
v=$AVER-stable
#v=master
mkdir -p cver
rm -rf cver2
mkdir cver2
cd cver2
curl \
-Lo1 https://raw.githubusercontent.com/alpinelinux/aports/refs/heads/$v/main/musl/APKBUILD \
-Lo2 https://raw.githubusercontent.com/alpinelinux/aports/refs/heads/$v/main/python3/APKBUILD \
-Lo3 https://raw.githubusercontent.com/alpinelinux/aports/refs/heads/$v/community/ffmpeg/APKBUILD \
;
zlib= ff=
cmp 1 ../cver/1 || zlib=1
cmp 2 ../cver/2 || zlib=1
cmp 3 ../cver/3 || ff=1
echo zlib=$zlib ff=$ff
[ "$1" ] && exit
[ $zlib ] && { make -C.. zlib; cp -pv 1 2 ../cver/; }
[ $ff ] && { make -C.. ff; cp -pv 3 ../cver/; }
rm -rf cver2
+108
View File
@@ -0,0 +1,108 @@
# building the images yourself
if you want to build the image from scratch then you've come to the right place -- however if you only want to make small modifications to the official image then jump down to [modifying an image](#modifying-an-image) or possibly [modding on the fly](#modding-on-the-fly)
```bash
./make.sh hclean pull img push
```
will download the latest copyparty-sfx.py from github unless you have [built it from scratch](../../docs/devnotes.md#just-the-sfx) and then build all the images based on that
deprecated alternative: run `make` to use the makefile however that uses docker instead of podman and only builds x86_64
`make.sh` is necessarily(?) overengineered because:
* podman keeps burning dockerhub pulls by not using the cached images (`--pull=never` does not apply to manifests)
* podman cannot build from a local manifest, only local images or remote manifests
but I don't really know what i'm doing here 💩
* auth for pushing images to repos;
`podman login docker.io`
`podman login ghcr.io -u 9001`
[about gchq](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry) (takes a classic token as password)
## building on alpine
```bash
apk add podman{,-docker}
rc-update add cgroups
service cgroups start
vim /etc/containers/storage.conf # driver = "btrfs"
modprobe tun
echo ed:100000:65536 >/etc/subuid
echo ed:100000:65536 >/etc/subgid
apk add qemu-openrc qemu-tools qemu-{arm,armeb,aarch64,s390x,ppc64le}
rc-update add qemu-binfmt
service qemu-binfmt start
```
# modifying an image
if you want to make a small change to the official image, for example [install a python package you need](https://github.com/9001/copyparty/issues/479), then the best approach is to build a new image based on the official one. There's a quick summary below, but check the internets if you want a better walkthrough.
**NOTE:** the `min` image is **not** a good idea to modify (brittle from shoehorning); use any of the other variants instead (`im`, `ac`, `iv`, `dj`)
first, create a new folder, and then create a new blank textfile named `Dockerfile` inside that folder:
```bash
mkdir customparty
cd customparty
nano Dockerfile
```
assuming you want to install the python-package "[requests](https://pypi.org/project/requests/)", which in [alpine](https://alpinelinux.org/) is called [py3-requests](https://pkgs.alpinelinux.org/package/edge/main/x86_64/py3-requests), then put the following contents into your `Dockerfile`:
```docker
FROM docker.io/copyparty/ac:latest
RUN apk add --no-cache py3-requests
```
build the new docker-image with the additional package you added:
```bash
docker pull docker.io/copyparty/ac:latest
docker build -t customparty .
```
now you can run the image `localhost/customparty:latest` which is `copyparty/ac:latest` with your changes
**one important thing to remember:** Whenever you want to update your copyparty version, you must rebuild that image by running those two docker commands (`pull` and `build`) in that folder
## modding on the fly
if you are not able to build your own image, then it is also possible to apply *some* changes as the image is starting up, before copyparty itself is launched. This is hacky but mostly-safe if done correctly
**NOTE:** the `min` image is **not** a good idea to modify (brittle from shoehorning); use any of the other variants instead (`im`, `ac`, `iv`, `dj`)
you should have a docker-volume which is mapped to `/cfg` in the container; in that volume, create a shellscript named (for example) `strikk-og-binders.sh` and then ensure that the docker-container is always executed with the environment-variable `DI_PREPARTY` set to `strikk-og-binders.sh`
* if you use docker-compose then see the [LD_PRELOAD](https://github.com/9001/copyparty/blob/hovudstraum/docs/examples/docker/basic-docker-compose/docker-compose.yml) example
**NOTE:** if you are doing this to [install a package you need](https://github.com/9001/copyparty/issues/479), then please make sure you **do not** download the package every time you restart copyparty, because that would result in excessive strain on Alpine's poor servers. You should cache the package locally. Here's an example `strikk-og-binders.sh` with caching, using [exiftool](https://pkgs.alpinelinux.org/package/edge/community/x86_64/exiftool) and [py3-requests](https://pkgs.alpinelinux.org/package/edge/main/x86_64/py3-requests) as the example packages to install
```bash
set -e # if something below goes wrong, then panic and crash
#set -x # uncomment this to debug (enable command-logging)
# packages to install
pkgs="exiftool py3-requests"
# if the docker-image is newer than the cache, then delete the cache
[ /z/initcfg -nt /cfg/apks/t ] && rm -rf /cfg/apks
# if the cache has the wrong packages, then delete the cache
grep -qF "$pkgs" /cfg/apks/t || rm -rf /cfg/apks
# if there is a cache, then just install those packages (remove -q to debug)
[ -e /cfg/apks ] && exec apk add -q --progress=no /cfg/apks/*.apk
# there is no cache; need to download+cache+install
mkdir /cfg/apks
apk add --cache-predownload --cache-dir /cfg/apks --progress=no $pkgs
echo "$pkgs" >/cfg/apks/t
touch -r /z/initcfg /cfg/apks/t
```
security-wise this is safe because apk-files are signed and thus tamper-proof
+243
View File
@@ -0,0 +1,243 @@
#!/bin/ash
set -ex
tmv() {
touch -r "$1" t
mv t "$1"
}
iawk() {
awk "$1" <"$2" >t
tmv "$2"
}
ised() {
sed -r "$1" <"$2" >t
tmv "$2"
}
# use custom ffmpeg if relevant
echo $1 | grep -qE 'ac|iv|dj' && [ ! -e "/z/stock_ffmpeg" ] && (
cp -pv /z/packages/*.pub /etc/apk/keys/
cd /z/packages/$(cat /etc/apk/arch)
apk add ./ffmpeg-*.apk
cd /z/test-aac
for f in *.m4a; do ffmpeg -v 0 -i $f ${f%.*}.flac || true; done
ls -1 *.flac | tee /dev/stderr | tr '\n' ' ' | grep -qE '^(lc.flac *)?$' || {
echo ERROR: incorrect aac decoder subset
exit 1
}
)
rm -rf /z/packages /z/test-aac
# use zlib-ng if available
f=/z/whl/zlib_ng-0.5.1-cp312-cp312-linux_$(cat /etc/apk/arch).whl
[ "$1" != min ] && [ -e $f ] && {
apk add -t .bd !pyc py3-pip
rm -f /usr/lib/python3*/EXTERNALLY-MANAGED
pip install $f
apk del .bd
}
rm -rf /z/whl
# cleanup for flavors with python build steps (dj/iv)
rm -rf /var/cache/apk/* /root/.cache
# initial config; common for all flavors
mkdir /state /cfg /w
chmod 777 /state /cfg /w
cat >initcfg <<'EOF'
[global]
chdir: /w
no-crt
% /cfg
EOF
# the bootstrap
cat >cpp.sh <<'EOF'
#!/bin/ash
set -e
[ "$DI_PREPARTY" ] && {
p="$DI_PREPARTY"
[ "$p" = "${p##*/}" ] || {
echo "ERROR: DI_PREPARTY must be filename only"
exit 1
}
echo "running DI_PREPARTY (/cfg/$p)"
/bin/ash "/cfg/$p" || { e=$?
echo "ERROR: DI_PREPARTY returned error $e"
exit $e
}
}
exec /usr/bin/python3 -m copyparty "$@"
EOF
# unpack sfx and dive in
python3 copyparty-sfx.py --version
cd /tmp/pe-copyparty.0
# steal the stuff we need
mv copyparty partftpy ftp/* /usr/lib/python3.*/site-packages/
# golf
cd /usr/lib/python3.*/
rm -rf \
/tmp/pe-* /z/copyparty-sfx.py \
ensurepip pydoc_data turtle.py turtledemo lib2to3
cd /usr/lib/python3.*/site-packages
rm -rf \
numpy/*/tests \
/usr/share/mime/packages/freedesktop.org.xml
cd /usr/lib/python3.*/site-packages/copyparty/
rm stolen/surrogateescape.py
iawk '/^[^ ]/{s=0}/^if not VENDORED:/{s=1}!s' qrkode.py
iawk '/^[^ ]/{s=0}/^ DNS_VND = False/{s=1;print" raise"}!s' mdns.py
# speedhack
ised 's/os.environ.get\("PRTY_NO_IMPRESO"\)/"1"/' util.py
# drop bytecode
find / -xdev -name __pycache__ -print0 | xargs -0 rm -rf
# build the stuff we want
python3 -m compileall -qj4 site-packages sqlite3 xml
# drop the stuff we dont
find -name __pycache__ |
grep -E 'ty/web/|/pycpar' |
tr '\n' '\0' | xargs -0 rm -rf
smoketest() {
# two-for-one:
# 1) smoketest copyparty even starts
# 2) build any bytecode we missed
# this tends to race other builders (alle gode ting er tre)
cd /z
python3 -m copyparty \
--ign-ebind -p$((1024+RANDOM)),$((1024+RANDOM)),$((1024+RANDOM)) \
-v .::r --no-crt -qi127.1 --exit=idx -e2dsa -e2ts
########################################################################
# test download-as-tar.gz
t=$(mktemp)
python3 -m copyparty \
--ign-ebind -p$((1024+RANDOM)),$((1024+RANDOM)),$((1024+RANDOM)) \
-v .::r --no-crt -qi127.1 --wr-h-eps $t & pid=$!
for n in $(seq 1 900); do sleep 0.2
v=$(awk '/^127/{print;n=1;exit}END{exit n-1}' $t) && break
done
[ -z "$v" ] && echo SNAAAAAKE && exit 1
rm $t
for n in $(seq 1 900); do sleep 0.2
wget -O- http://${v/ /:}/?tar=gz:1 >tf && break
done
tar -xzO top/innvikler.sh <tf | cmp innvikler.sh
rm tf
kill $pid; wait $pid
########################################################################
# output from -e2d
rm -rf .hist /cfg/copyparty
}
smoketest
[ "$1" == min ] && {
# shrink amd64 from 45.5 to 33.2 MiB
# libstdc++ is pulled in by libmpdec++ in libmpdec; keep libmpdec.so
cd /usr/lib ; rm -rf \
libmpdec++.so* \
libncurses* \
libpanelw* \
libreadline* \
libstdc++.so* \
--
cd /usr/lib/python3.*/lib-dynload/ ; rm -rf \
*audioop.* \
_asyncio.* \
_ctypes_test.* \
_curses* \
_test* \
_xx* \
ossaudio.* \
readline.* \
xx* \
--
# keep http/client for u2c
cd /usr/lib/python3.*/ ; rm -rf \
site-packages/*.dist-info \
aifc.py \
asyncio \
bdb.py \
cgi.py \
config-3.*/Makefile \
ctypes/macholib \
dbm \
difflib.py \
doctest.py \
email/_header_value_parser.py \
html \
http/cookiejar.* \
http/server.* \
imaplib.py \
importlib/resources \
mailbox.py \
nntplib.py \
pickletools.py \
pydoc.py \
smtplib.py \
statistics.py \
tomllib \
unittest \
venv \
wsgiref \
xml/dom \
xml/sax \
xmlrpc \
--
set +x
find -iname '*.pyc' |
grep -viE 'tftpy' |
while IFS= read -r x; do
y="$(printf '%s\n' "$x" | sed -r 's`/__pycache__/([^/]+)\.cpython-312\.pyc$`/\1.py`')"
[ -e "$y" ] || continue
[ "$y" = "$x" ] && continue
rm "$y"
mv "$x" "${y}c"
done
find -iname __pycache__ -print0 | xargs -0 rm -rf --
rm -rf /a
set -x
smoketest
# printf '%s\n' 'FROM localhost/copyparty-min-amd64' 'COPY a /' 'RUN /bin/ash /a' >Dockerfile
# podman rmi localhost/m2 ; podman build --squash-all -t m2 . && podman images && podman run --rm -it localhost/m2 --exit=idx && podman images
}
# goodbye
exec rm innvikler.sh
+219
View File
@@ -0,0 +1,219 @@
#!/bin/bash
set -e
self=$(cd -- "$(dirname "$BASH_SOURCE")"; pwd -P)
cd "$self"
[ $(id -u) -eq 0 ] && {
echo dont root
exit 1
}
suf=-b1
suf=
sarchs="386 amd64 arm/v7 arm64/v8 ppc64le s390x"
archs="amd64 arm s390x 386 arm64 ppc64le"
imgs="dj iv min im ac"
dhub_order="iv dj min im ac"
ghcr_order="ac im min dj iv"
ngs=(
iv-{ppc64le,s390x,arm}
dj-{ppc64le,s390x,arm}
)
err=
for x in awk jq podman python3 tar wget ; do
command -v $x >/dev/null && continue
err=1; echo ERROR: missing dependency: $x
done
[ $err ] && exit 1
getver() {
ver=$(
python3 ../../dist/copyparty-sfx.py --version 2>/dev/null |
awk '/^copyparty v/{sub(/-.*/,"");sub(/v/,"");print$2;exit}'
)
echo $ver | grep -E '[0-9]\.[0-9]' || {
echo no ver
exit 1
}
}
for v in "$@"; do
[ "$v" = clean ] && clean=1
[ "$v" = hclean ] && hclean=1
[ "$v" = purge ] && purge=1
[ "$v" = pull ] && pull=1
[ "$v" = img ] && img=1
[ "$v" = push ] && push=1
[ "$v" = sh ] && sh=1
done
[ $# -gt 0 ] || {
echo "need list of commands, for example: hclean pull img push"
exit 1
}
[ $sh ] && {
printf "\n\033[1;31mopening a shell in the most recently created docker image\033[0m\n"
podman run --rm -it --entrypoint /bin/ash $(podman images -aq | head -n 1)
exit $?
}
filt=
[ $clean ] && filt='/<none>/{print$$3}'
[ $hclean ] && filt='/localhost\/(copyparty|alpine)-/{print$3}'
[ $purge ] && filt='NR>1{print$3}'
[ $filt ] && {
[ $purge ] && {
podman kill $(podman ps -q) || true
podman rm $(podman ps -qa) || true
}
podman rmi -f $(podman images -a --history | awk "$filt") || true
podman rmi $(podman images -a --history | awk '/^<none>.*<none>.*-tmp:/{print$3}') || true
}
[ $pull ] && {
for a in $sarchs; do # arm/v6
podman pull --arch=$a alpine:latest
done
podman images --format "{{.ID}} {{.History}}" |
awk '/library\/alpine/{print$1}' |
while read id; do
tag=alpine-$(podman inspect $id | jq -r '.[]|.Architecture' | tr / -)
[ -e .tag-$tag ] && continue
touch .tag-$tag
echo tagging $tag
podman untag $id
podman tag $id $tag
done
rm .tag-*
}
[ $img ] && {
getver
t_ver="org.opencontainers.image.version=$ver"
t_cre="org.opencontainers.image.created=$( date -u +%Y-%m-%dT%H:%M:%SZ )"
vbt="LABEL $(echo "$t_ver $t_cre" | sed -r 's/=([^ ]+)/="\1"/g' )"
[ -e base/test-aac/lc.m4a ] || (
echo building aac smoketest
mkdir -p base/test-aac
cd base/test-aac
ffmpeg -nostdin -y -f lavfi -i sine -ac 2 -t 1 a.wav &&
fdkaac -m 3 -o lc.m4a a.wav &&
fdkaac -m 2 -p 5 -o he.m4a a.wav &&
fdkaac -m 1 -p 29 -o he2.m4a a.wav &&
fdkaac -m 3 -p 23 -o ld.m4a a.wav &&
fdkaac -m 3 -p 39 -o eld.m4a a.wav ||
echo "nevermind, failed to build test files, cannot verify aac decoding"
rm -f a.wav
)
fp=../../dist/copyparty-sfx.py
[ -e $fp ] || {
echo downloading copyparty-sfx.py ...
mkdir -p ../../dist
wget https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py -O $fp
}
# enable arm32 crossbuild from aarch64 (macbook or whatever)
[ $(uname -m) = aarch64 ] && [ ! -e /proc/sys/fs/binfmt_misc/qemu-arm ] &&
echo ":qemu-arm:M:0:\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:F" |
sudo tee >/dev/null /proc/sys/fs/binfmt_misc/register
# kill abandoned builders
ps aux | awk '/bin\/qemu-[^-]+-static/{print$2}' | xargs -r kill -9
# grab deps
rm -rf i err
mkdir i
tar -cC "$self/base" whl test-aac \
-C "$self/base/b" packages \
-C "$self/../.." bin/mtag \
-C dist copyparty-sfx.py \
| tar -xvCi
for i in $imgs; do
podman rm copyparty-$i || true # old manifest
sed -r "s/^#vbt.*/$vbt/" <Dockerfile.$i >.Dockerfile.$i.w
for a in $archs; do
[[ " ${ngs[*]} " =~ " $i-$a " ]] && continue # known incompat
# wait for a free slot
while true; do
touch .blk
[ $(jobs -p | wc -l) -lt $(nproc) ] && break
while [ -e .blk ]; do sleep 0.2; done
done
aa="$(printf '%11s' $a-$i)"
# arm takes forever so make it top priority
[ ${a::3} == arm ] && nice= || nice=-n20
# not sure if this is necessary or if inherit-annotations=false was enough, but won't hurt
readarray -t annot < <(awk <Dockerfile.$i '/org.opencontainers.image/{sub(/[^\.]+/,"");sub(/[" \\]+$/,"");sub(/"/,"");print"--annotation";print"org"$0}')
annot+=( --annotation "$t_ver" --annotation "$t_cre" )
# --pull=never does nothing at all btw
(set -x
nice $nice podman build \
--squash \
--pull=never \
--from localhost/alpine-$a \
--inherit-annotations=false \
"${annot[@]}" \
-t copyparty-$i-$a$suf \
-f .Dockerfile.$i.w . ||
(echo $? $i-$a >> err; printf '%096d\n' $(seq 1 42))
rm -f .blk
) 2> >(tee $a.err | sed "s/^/$aa:/" >&2) > >(tee $a.out | sed "s/^/$aa:/") &
done
[ -e err ] && {
echo somethign died,
cat err
pkill -P $$
exit 1
}
for a in $archs; do
rm -f $a.{out,err}
done
done
wait
rm -f .Dockerfile.*.w
[ -e err ] && {
echo somethign died,
cat err
pkill -P $$
exit 1
}
# avoid podman race-condition by creating manifest manually --
# Error: creating image to hold manifest list: image name "localhost/copyparty-dj:latest" is already associated with image "[0-9a-f]{64}": that name is already in use
for i in $imgs; do
variants=
for a in $archs; do
[[ " ${ngs[*]} " =~ " $i-$a " ]] && continue
variants="$variants containers-storage:localhost/copyparty-$i-$a$suf"
done
podman manifest rm copyparty-$i$suf || echo "(that's fine btw)"
podman manifest create copyparty-$i$suf $variants
done
}
[ $push ] && {
getver
for i in $dhub_order; do
printf '\ndockerhub %s\n' $i
podman manifest push --all copyparty-$i copyparty/$i:$ver
podman manifest push --all copyparty-$i copyparty/$i:beta
podman manifest push --all copyparty-$i copyparty/$i:latest
done &
for i in $ghcr_order; do
printf '\nghcr %s\n' $i
podman manifest push --all copyparty-$i ghcr.io/9001/copyparty-$i:$ver
podman manifest push --all copyparty-$i ghcr.io/9001/copyparty-$i:latest
done &
wait
}
echo ok