File audiobookshelf.spec of Package audioboookshelf
%define uid audiobookshelf
%define gid audiobookshelf
%define node_version 24.13.0
Name: audiobookshelf
Version: 2.33.0
Release: 2%{?dist}
Summary: A self-hosted audiobook and podcast server.
Group: Applications/Multimedia
License: GPL-3.0
URL: https://audiobookshelf.org
Source0: https://github.com/advplyr/audiobookshelf/archive/refs/tags/v%{version}.tar.gz
Source1: https://nodejs.org/download/release/v%{node_version}/node-v%{node_version}-headers.tar.gz
# Generated by the download_npm_lock script. Pass in
# --url https://raw.githubusercontent.com/advplyr/audiobookshelf/refs/tags/v%{version}/client/package-lock.json
Source2: npm_cache.tar.gz
BuildRequires: tar
BuildRequires: gzip
BuildRequires: nodejs-common
BuildRequires: npm24
BuildRequires: nodejs24 == %{node_version}
Requires: ffmpeg >= 4
Requires: tone >= 0.1.3
Requires: nodejs >= 1:20
BuildRequires: systemd
Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd
%description
Audiobookshelf is a self-hosted audiobook and podcast server.
%prep
%setup -q
%build
# Need to run npm from local cache. OBS doesn't have internet
mkdir .npm_cache
tar zxf %{SOURCE2} -C .npm_cache
mkdir -p ~/.cache/node-gyp/%{node_version}
tar -xf %{SOURCE1} --directory ~/.cache/node-gyp/%{node_version}/ --strip-components 1
echo 11 > ~/.cache/node-gyp/%{node_version}/installVersion
# Build client
cd client
npm install --offline --cache ../.npm_cache
npm run generate
cd ..
# Update systemd unit
sed -i 's#^WorkingDirectory=.*$#WorkingDirectory=%{_sharedstatedir}/%{name}#' build/debian/lib/systemd/system/audiobookshelf.service
sed -i 's#^ExecStart=.*$#ExecStart=%{_bindir}/%{name} --source=rpm#' build/debian/lib/systemd/system/audiobookshelf.service
# Build configuration
echo METADATA_PATH=%{_sharedstatedir}/%{name}/metadata > etc-default-audiobookshelf
echo CONFIG_PATH=%{_sharedstatedir}/%{name}/config >> etc-default-audiobookshelf
echo PORT=13378 >> etc-default-audiobookshelf
echo HOST=127.0.0.1 >> etc-default-audiobookshelf
echo '#!/bin/sh' > bin-%{name}
echo 'cd %{_datadir}/%{name}/' >> bin-%{name}
echo 'export PATH=.:$PATH' >> bin-%{name}
echo 'node prod.js $@' >> bin-%{name}
%install
rm -rf %{buildroot}
# Create directories
mkdir -m 755 -p %{buildroot}%{_sharedstatedir}/%{name}/metadata
mkdir -m 755 -p %{buildroot}%{_sharedstatedir}/%{name}/config
mkdir -m 755 -p %{buildroot}%{_datadir}/%{name}/client
# Add Audiobookshelf
mv client/dist/ %{buildroot}%{_datadir}/%{name}/client/
rm -rf %{buildroot}%{_datadir}/%{name}/client/node_modules
#mv node_modules/ package.json package-lock.json prod.js server/ %{buildroot}%{_datadir}/%{name}/
mv package.json package-lock.json prod.js server/ %{buildroot}%{_datadir}/%{name}/
# Install systemd unit file
install -p -D -m 0644 \
build/debian/lib/systemd/system/audiobookshelf.service \
%{buildroot}%{_unitdir}/%{name}.service
# Install configuration
install -p -D -m 0644 etc-default-audiobookshelf %{buildroot}%{_sysconfdir}/default/%{name}
# Install binary
install -p -D -m 0755 bin-%{name} %{buildroot}%{_bindir}/%{name}
%pre
# Create user and group if nonexistent
if [ ! $(getent group %{gid}) ]; then
groupadd -r %{gid} > /dev/null 2>&1 || :
fi
if [ ! $(getent passwd %{uid}) ]; then
useradd -M -r -d /srv/opencast -g %{gid} %{uid} > /dev/null 2>&1 || :
fi
%post
%systemd_post audiobookshelf.service
# (SELinux) Allow httpd to serve client directly
semanage fcontext -a -t httpd_sys_content_t "%{_datadir}/%{name}/client/dist(/.*)?" || :
restorecon -R -v "%{_datadir}/%{name}/client/dist/" || :
cd /usr/share/audiobookshelf/
npm install
%preun
%systemd_preun audiobookshelf.service
%postun
%systemd_postun_with_restart audiobookshelf.service
%files
%config(noreplace) %{_sysconfdir}/default/%{name}
%{_unitdir}/%{name}.service
%{_bindir}/%{name}
%{_datadir}/%{name}
%attr(755,%{uid},%{gid}) %{_sharedstatedir}/%{name}
%changelog