# aria.fm — RPM repack of the published Linux release tarball. # # This deliberately mirrors packaging/aur/PKGBUILD: same /opt layout, same # launcher, same runtime dependency set, same refusal to strip. Read the two # together — where they disagree, one of them is wrong. # # This is NOT a from-source build. The tarball ships prebuilt Electron/Chromium # binaries, which Fedora proper would reject as bundled libraries; the target # here is COPR / self-hosted repos, the same audience as the AUR package. %global appname aria.fm %global instdir /opt/%{appname} # Do not strip. The app dir ships prebuilt Electron/Chromium binaries and the # Go sidecar; stripping Electron produces a binary that fails to start. This is # the RPM spelling of the AUR package's options=('!strip'). # # Both globals are required, and for different reasons: debug_package %%{nil} # stops rpm generating a -debuginfo subpackage, and __os_install_post %%{nil} # disables the whole brp-* pipeline, of which brp-strip is the member that # breaks us. Setting only debug_package still leaves brp-strip running. %global debug_package %{nil} %global __os_install_post %{nil} # Keep rpm's ELF scanner out of %%{instdir}, in BOTH directions: # # provides — the bundle ships libEGL.so, libGLESv2.so, libffmpeg.so, # libvulkan.so.1 and libvk_swiftshader.so. Auto-provides would advertise # those as if they were the system libraries of the same name and let them # satisfy unrelated packages' dependencies. # # requires — aria-shell carries a NEEDED on libffmpeg.so, resolved out of its # own directory. Suppressing provides while leaving requires enabled turns # that into an unsatisfiable dependency on a library nothing declares, and # the package becomes uninstallable. # # Consequence: the Requires list below is hand-maintained, not generated. To # re-derive it after an Electron bump, run over an unpacked tarball: # # find . -type f -exec sh -c 'file -b "$1" | grep -q ELF && objdump -p "$1" \ # | awk "/NEEDED/{print \$2}"' _ {} \; | sort -u # %global __provides_exclude_from ^%{instdir}/.*$ %global __requires_exclude_from ^%{instdir}/.*$ Name: aria-fm Version: 0.7.3 Release: 1%{?dist} Summary: Native Spotify desktop client — Go + Electron (Chromium) + librespot License: MIT URL: https://gitlab.com/cmdly/aria.fm # BOTH arch tarballs are listed unconditionally, and %prep unpacks whichever # matches the target. This looks wasteful next to a single %%{_arch}-templated # Source0 — which is what this used to be — but that form cannot survive COPR. # # COPR builds the SRPM ONCE and reuses it for every enabled chroot. An # arch-templated Source0 is resolved on the SRPM builder, so the SRPM would # carry only that builder's tarball and the other chroot's %prep would fail # looking for a directory that was never packed. Listing both keeps one SRPM # valid for both chroots, keeps rpm's sha256 source verification, and needs no # project-level network permission. # # The cost is a ~262MB SRPM that every chroot downloads in full. That is the # accepted trade; see packaging/README.md. # # Same generic package registry URL the AUR PKGBUILD pulls from. The %%2F is a # literal percent-encoded slash in the GitLab project path and must be written # %%%%2F in a spec so rpm's macro expansion leaves one %% behind. Source0: https://gitlab.com/api/v4/projects/cmdly%%2Faria.fm/packages/generic/aria-fm/v%{version}/aria-fm-v%{version}-linux-x86_64.tar.gz Source1: https://gitlab.com/api/v4/projects/cmdly%%2Faria.fm/packages/generic/aria-fm/v%{version}/aria-fm-v%{version}-linux-aarch64.tar.gz # Both arches are published as of v0.6.5 (`build:linux-arm64` in .gitlab-ci.yml), # and both are verified end to end on Fedora Asahi — build, install, launch. ExclusiveArch: x86_64 aarch64 # Runtime dependencies. Split by how each one is actually reached, because the # distinction decides whether an ELF scanner could ever have found it: # # NEEDED by aria-shell (the Electron/Chromium binary) — hard dynamic links. Requires: gtk3 Requires: nss Requires: nspr Requires: atk Requires: at-spi2-atk Requires: at-spi2-core Requires: cairo Requires: pango Requires: glib2 Requires: expat Requires: cups-libs Requires: dbus-libs Requires: mesa-libgbm Requires: libX11 Requires: libXcomposite Requires: libXdamage Requires: libXext Requires: libXfixes Requires: libXrandr Requires: libxcb Requires: libxkbcommon Requires: systemd-libs Requires: libgcc # # alsa-lib is BOTH a NEEDED of aria-shell and a runtime dlopen target of the # Go sidecar, which is cgo-free and binds libasound.so.2 through purego # (internal/audio/backend_alsa_linux.go, opening PCM "default"). Note the AUR # PKGBUILD's comment claims "nothing links it at build time" — that is not # accurate for the Electron binary, though the conclusion is the same: # runtime dependency, no BuildRequires, no headers, no pkg-config. # PipeWire/PulseAudio users still need it; their ALSA plugins sit behind the # same libasound. Requires: alsa-lib # # dlopen-only — these are NOT in any NEEDED entry, so nothing could infer # them. Chromium opens libXss for idle detection and libnotify for desktop # notifications, both lazily. Requires: libXScrnSaver Requires: libnotify # # Icon theme hierarchy for the 512x512 icon installed below. Requires: hicolor-icon-theme # openssl is deliberately absent. librespot-ffi moved from native-tls to # rustls, so the cdylib links no libssl/libcrypto — verified with # `objdump -p liblibrespot_ffi.so | grep NEEDED`, which shows only libgcc_s, # libm, libc and the loader. Trust roots come from the system store # (ca-certificates, already present on any Fedora install). # # The cdylib itself is not a file in this package: it is go:embed'ed into # aria-server and extracted to $XDG_CACHE_HOME/aria/lib at first use, so rpm's # scanner cannot see its libgcc_s.so.1 requirement. That is why libgcc is # listed explicitly above rather than left to inference. Provides: aria.fm = %{version}-%{release} Conflicts: aria.fm %description aria.fm is a native Spotify desktop client built as a Go sidecar (aria-server) paired with an Electron shell, with librespot wrapped in a Rust cdylib and loaded at runtime over FFI. This package installs a prebuilt release: the Electron application bundle, including its own Chromium runtime, lands in %{instdir}, with a launcher at %{_bindir}/aria. A Spotify Premium account is required for playback. %prep # Unpack only the tarball matching the build target. The other one is present in # the SRPM (see the Source0/Source1 note above) and deliberately left packed. # ExclusiveArch limits this to exactly these two arches, so %else is aarch64. %ifarch x86_64 %setup -q -n aria-fm-v%{version}-linux-x86_64 %else %setup -q -T -b 1 -n aria-fm-v%{version}-linux-aarch64 %endif %build # Nothing to build — this is a repack of a released binary tarball. %install # The whole Electron app: shell binary, Chromium runtime, and the aria-server # sidecar under resources/. install -d %{buildroot}%{instdir} cp -a ./* %{buildroot}%{instdir}/ # Installed separately below under their proper system paths; don't double-ship. rm -f %{buildroot}%{instdir}/aria.desktop \ %{buildroot}%{instdir}/aria.png \ %{buildroot}%{instdir}/LICENSE # Launcher on PATH. install -d %{buildroot}%{_bindir} cat > %{buildroot}%{_bindir}/aria <<'LAUNCHER' #!/bin/sh exec /opt/aria.fm/aria-shell "$@" LAUNCHER chmod 755 %{buildroot}%{_bindir}/aria # chrome-sandbox must be setuid root for Electron's setuid sandbox path. On a # kernel with unprivileged user namespaces enabled (Fedora's default) Chromium # prefers the namespace sandbox and never execs this, but shipping it # non-setuid breaks the fallback with "SUID sandbox helper binary is not # configured correctly". Set here rather than via %%attr in %%files so the file # is listed exactly once (a glob plus an %%attr line for the same path builds, # but warns "File listed twice"). chmod 4755 %{buildroot}%{instdir}/chrome-sandbox install -Dm644 aria.desktop %{buildroot}%{_datadir}/applications/aria.desktop # Icon installed under the name the desktop file references (Icon=aria). install -Dm644 aria.png \ %{buildroot}%{_datadir}/icons/hicolor/512x512/apps/aria.png %files %license LICENSE %{_bindir}/aria %{_datadir}/applications/aria.desktop %{_datadir}/icons/hicolor/512x512/apps/aria.png %dir %{instdir} # Modes come from the buildroot as-is, including the setuid bit set on # chrome-sandbox in %%install. %{instdir}/* %changelog * Tue Sep 08 2026 Kaylin Aurora - 0.7.3-1 - Update to 0.7.3. * Sat Sep 05 2026 Kaylin Aurora - 0.7.2-1 - Update to 0.7.2. * Thu Sep 03 2026 Kaylin Aurora - 0.7.1-1 - Update to 0.7.1. * Wed Sep 02 2026 Kaylin Aurora - 0.7.0-1 - Update to 0.7.0. * Wed Aug 19 2026 Kaylin Aurora - 0.6.7-1 - Update to 0.6.7. * Mon Aug 10 2026 Kaylin Aurora - 0.6.6-1 - Update to 0.6.6. * Wed Jul 29 2026 Kaylin Aurora - 0.6.5-1 - Update to 0.6.5, the first release publishing a linux-aarch64 tarball. - Ship both arch tarballs as Source0/Source1 so a single SRPM builds correctly in every COPR chroot; %prep unpacks the one matching the target. * Wed Jul 29 2026 Kaylin Aurora - 0.6.4-1 - Initial RPM packaging, mirroring the AUR binary repack.