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
openSUSE Build Service is sponsored by