# Classic Shairport-Sync build. Note: the only decoder in FFmpeg is ALAC.

ARG SHAIRPORT_SYNC_BRANCH=.
ARG FFMPEG_BRANCH=release/8.1
ARG ALPINE_VERSION=3.23.4

##### FFMPEGLITE #####
FROM alpine:$ALPINE_VERSION AS ffmpeglite
RUN apk -U add build-base git nasm pkgconf
RUN mkdir -p /ffmpeg_sources /ffmpeg_build
WORKDIR /ffmpeg_sources
ARG FFMPEG_BRANCH
RUN git clone --depth=1 -b "$FFMPEG_BRANCH" https://github.com/FFmpeg/FFmpeg
WORKDIR /ffmpeg_sources/FFmpeg
RUN ./configure \
  --prefix="/ffmpeg_build" \
  --extra-libs="-lpthread -lm" \
  --ld="g++" \
  --disable-static \
  --enable-shared \
  --enable-gpl \
  --disable-programs \
  --disable-everything \
  --disable-doc \
  --disable-iconv \
  --disable-avdevice \
  --disable-avfilter \
  --disable-swscale \
  --disable-network \
  --disable-iamf \
  --disable-pixelutils \
  --enable-decoder=alac
RUN make
RUN make install
##### FFMPEGLITE END #####

##### SPS #####
FROM alpine:$ALPINE_VERSION AS shairport-sync

RUN apk -U add \
        pkgconf \
        alsa-lib-dev \
        autoconf \
        automake \
        avahi-dev \
        build-base \
        dbus \
        git \
        libconfig-dev \
        openssl-dev \
        libsndfile-dev \
        libtool \
        pipewire-dev \
        mosquitto-dev \
        popt-dev \
        pulseaudio-dev \
        soxr-dev \
        xxd

ARG SHAIRPORT_SYNC_BRANCH
WORKDIR /shairport-sync
COPY . .
RUN rm -rf build
# the above three lines or the following...
# RUN git clone --depth=1 -b "SHAIRPORT_SYNC_BRANCH" https://github.com/mikebrady/sps-private shairport-sync

COPY --from=ffmpeglite /ffmpeg_build/lib/ /usr/local/lib
COPY --from=ffmpeglite /ffmpeg_build/lib/pkgconfig/*.pc  /usr/local/lib/pkgconfig/
COPY --from=ffmpeglite /ffmpeg_build/include/  /usr/local/include

# RUN git checkout "$SHAIRPORT_SYNC_BRANCH"
# the following is to remove any build directory that might be there
# not needed if the source is a clone of the repository
# RUN rm -rf build
WORKDIR /shairport-sync/build
RUN autoreconf -i ../
RUN ../configure --sysconfdir=/etc --with-alsa --with-pulseaudio --with-soxr --with-avahi --with-ssl=openssl \
        --with-ffmpeg --with-metadata --with-dummy --with-pipe --with-dbus-interface \
        --with-stdout --with-mpris-interface --with-mqtt-client \
        --with-convolution --with-pipewire
RUN make
RUN DESTDIR=install make install
WORKDIR /
##### SPS END #####

##### STATIC FILES #####
FROM scratch AS files

# Add run script that will start SPS
COPY --chmod=755 ./docker/classic/run.sh ./run.sh
COPY ./docker/etc/pulse /etc/pulse
##### END STATIC FILES #####

##### BUILD FILES #####
FROM scratch AS build-files
COPY --from=ffmpeglite /ffmpeg_build/lib/ /usr/local/lib
COPY --from=shairport-sync /shairport-sync/build/install/usr/local/bin/shairport-sync /usr/local/bin/shairport-sync
COPY --from=shairport-sync /shairport-sync/build/install/usr/local/share/man/man1 /usr/share/man/man1
COPY --from=shairport-sync /shairport-sync/build/install/etc/shairport-sync.conf /etc/
COPY --from=shairport-sync /shairport-sync/build/install/etc/shairport-sync.conf.sample /etc/
COPY --from=shairport-sync /shairport-sync/build/install/etc/dbus-1/system.d/shairport-sync-dbus.conf /etc/dbus-1/system.d/
COPY --from=shairport-sync /shairport-sync/build/install/etc/dbus-1/system.d/shairport-sync-mpris.conf /etc/dbus-1/system.d/
##### END BUILD FILES #####

# Shairport Sync Runtime System
FROM alpine:$ALPINE_VERSION

COPY --from=build-files / /

RUN apk --no-cache add \
        alsa-lib \
        avahi \
        dbus \
        glib \
        libconfig \
        pipewire \
        libpulse \
        libcrypto3 \
        mosquitto \
        popt \
        soxr \
        curl && \
        rm -rfv /lib/apk/db/* && \
        rm -rfv /etc/avahi/services/*.service && \
        rm -rf /usr/share/man && \
        addgroup shairport-sync && \
        adduser -D shairport-sync -G shairport-sync && \
        addgroup -g 29 docker_audio && \
        addgroup shairport-sync docker_audio && \
        addgroup shairport-sync audio && \
        mkdir -p /run/dbus

# Removed anything we don't need.
# Removed any statically-defined Avahi services, e.g. SSH and SFTP

# Created non-root user for running the container -- running as the user 'shairport-sync' also allows
# Shairport Sync to provide the D-Bus and MPRIS interfaces within the container
# Added the shairport-sync user to the pre-existing audio group, which has ID 29, for access to the ALSA stuff

COPY --from=files / /
ENV ENABLE_AVAHI=1
ENTRYPOINT ["./run.sh"]
