# Maintainer: Duncan Tourolle # # JellyTau — a cross-platform Jellyfin client (Tauri + SvelteKit). # # This PKGBUILD builds from the local source tree by default (see the `dev` # convenience below), which is what scripts/build-arch.sh uses inside the Arch # Docker stage. For AUR distribution, replace the `source=()` line with a release # tarball/VCS URL and drop the local-copy prepare() step. pkgname=jellytau pkgver=0.9.1 pkgrel=1 pkgdesc="A cross-platform Jellyfin client" arch=('x86_64') url="https://gitea.tourolle.paris/dtourolle/jellytau" license=('MIT') # Runtime: libmpv for audio, webkit2gtk for the webview + HTML5 transcoded video. depends=('webkit2gtk-4.1' 'mpv' 'gtk3' 'libayatana-appindicator') makedepends=('rust' 'cargo' 'bun' 'nodejs' 'pkgconf' 'libsoup3') options=('!strip' '!lto') # Populated from the working tree by scripts/build-arch.sh (SRC env var). _srcdir="${JELLYTAU_SRC:-$startdir/../..}" build() { cd "$_srcdir" export CARGO_HOME="${CARGO_HOME:-$srcdir/cargo-home}" bun install --frozen-lockfile || bun install bun run build # Only the raw binary is needed; packaging is done in package() below so we # control the Arch filesystem layout ourselves rather than via tauri-bundler. # # 🔴 `tauri/custom-protocol` is not optional. `tauri build` passes it for you; # a bare `cargo build` does not, and without it Tauri loads the frontend from # `devUrl` rather than the assets embedded from `frontendDist`. The result # builds and installs cleanly and then cannot load its own UI. check() guards # this. (cd src-tauri && cargo build --release --locked --features tauri/custom-protocol) } check() { cd "$_srcdir" # A Tauri binary built without `custom-protocol` does not embed the frontend; # it serves it from `devUrl` (http://localhost:1420) instead. It compiles, # links and installs perfectly, then launches into "Could not connect to # localhost: Connection refused" — which is what this package did for its # entire existence, because `tauri build` adds that feature for you and a bare # `cargo build` does not. # # Test for the *assets*, not for the dev URL: `devUrl` is part of the config # blob that generate_context!() embeds either way, so its presence proves # nothing. A content-hashed filename from the vite build can only be in the # binary if the bundle was embedded — the with-feature binary is ~400 KB # larger for exactly this reason. local _binary="src-tauri/target/release/jellytau" local _asset _asset="$(basename "$(ls -1 build/_app/immutable/entry/*.js | head -n1)")" if [ -z "$_asset" ]; then echo "==> ERROR: no frontend build found — 'bun run build' did not produce build/_app." >&2 return 1 fi if ! grep -qa "$_asset" "$_binary"; then echo "==> ERROR: the frontend bundle is not embedded in the binary." >&2 echo " Build with --features tauri/custom-protocol, or the packaged app" >&2 echo " will start up unable to load its own UI." >&2 return 1 fi } package() { cd "$_srcdir" install -Dm755 "src-tauri/target/release/jellytau" \ "$pkgdir/usr/bin/jellytau" # Desktop entry install -Dm644 "packaging/arch/jellytau.desktop" \ "$pkgdir/usr/share/applications/jellytau.desktop" # MIT is not in /usr/share/licenses/common, so Arch packaging requires the # licence text to ship with the package. install -Dm644 "LICENSE" \ "$pkgdir/usr/share/licenses/$pkgname/LICENSE" # Icons (hicolor) install -Dm644 "src-tauri/icons/32x32.png" \ "$pkgdir/usr/share/icons/hicolor/32x32/apps/jellytau.png" install -Dm644 "src-tauri/icons/128x128.png" \ "$pkgdir/usr/share/icons/hicolor/128x128/apps/jellytau.png" install -Dm644 "src-tauri/icons/128x128@2x.png" \ "$pkgdir/usr/share/icons/hicolor/256x256/apps/jellytau.png" }