chore: import upstream snapshot with attribution
This commit is contained in:
@@ -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"]
|
||||
@@ -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"]
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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"]
|
||||
@@ -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"]
|
||||
@@ -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"]
|
||||
@@ -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"]
|
||||
@@ -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`
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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`
|
||||
@@ -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/
|
||||
Executable
+117
@@ -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/
|
||||
Executable
+116
@@ -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
|
||||
@@ -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 */
|
||||
Executable
+29
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Executable
+219
@@ -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
|
||||
Reference in New Issue
Block a user