A tool to decrypt Apple Music songs. An active subscription is still needed.
Supports only x86_64 and arm64 Linux.
Installation methods:
- Docker (recommended)
- Prebuilt binaries (from releases or actions)
- Build from source
Available for x86_64 and arm64. Need to download prebuilt version from releases or actions.
- Build image:
docker build --tag ghcr.io/worldobservationlog/wrapper:local .
- Login:
docker run --privileged --rm -it -v ./rootfs/data:/app/rootfs/data --entrypoint ./wrapper ghcr.io/worldobservationlog/wrapper:local -L "username:password" -H 0.0.0.0
Quit after this (using Ctrl-C).
- Run:
docker run --privileged -v ./rootfs/data:/app/rootfs/data -p 10020:10020 -p 20020:20020 -p 30020:30020 -e args="-H 0.0.0.0" ghcr.io/worldobservationlog/wrapper:local
- Install dependencies:
-
Build tools:
sudo apt install build-essential cmake curl unzip git -
LLVM:
sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" -
Android NDK r23b:
curl -fLO https://dl.google.com/android/repository/android-ndk-r23b-linux.zip unzip -d . android-ndk-r23b-linux.zip
- Build:
git clone https://github.com/WorldObservationLog/wrapper
cd wrapper
mkdir build
cd build
cmake ..
make -j$(nproc)
Usage: wrapper [OPTION]...
-h, --help Print help and exit
-V, --version Print version and exit
-H, --host=STRING (default=`127.0.0.1')
-D, --decrypt-port=INT (default=`10020')
-M, --m3u8-port=INT (default=`20020')
-A, --account-port=INT (default=`30020')
-P, --proxy=STRING (default=`')
-L, --login=STRING (username:password)
-F, --code-from-file (default=off)
- Anonymous, for providing the original version of this project and the legacy Frida decryption method.
- chocomint, for providing support for arm64 arch.
This repository contains local enhancements to improve concurrency, resilience, and automated build flows:
- Multi-threaded Connection Handling: Spawns independent POSIX threads (
pthread) to handledecrypt,m3u8, andaccountnetwork connections. This avoids blocking synchronous handling and allows concurrent decryption processing. - Resilient Daemon Mode: In concurrent mode, callback triggers like lease ending (
endLeaseCb) or playback errors (pbErrCb) are intercepted and logged without terminating the wrapper process (exit). This prevents single-request failures from shutting down the entire service. - Increased Listen Backlog: The listen socket backlog is raised from
5to32to accommodate higher concurrent decryption requests. - GitHub Actions Workflows:
- Build for x86_64: Automatically compiles the wrapper binary on push/PR, updates the
wrapper.x86_64.latesttag, and uploads the latest zip artifact. - wrapper-qemu: Post-build workflow that downloads a basic QEMU disk image, mounts it using
qemu-nbd, copies the newly compiledwrapperbinary into the image, and packages it as an artifact.
- Build for x86_64: Automatically compiles the wrapper binary on push/PR, updates the