🏗️ Build and Test JellyTau / Run Tests (push) Skipped
🏗️ Build and Test JellyTau / Android Compile Check (push) Skipped
🏗️ Build and Test JellyTau / Supply Chain (push) Successful in 3m41s
Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m20s
Traceability Validation / Check Requirement Traces (push) Successful in 11s
Build & Release / Run Tests (push) Successful in 14m44s
Build & Release / Build Linux (push) Successful in 20m30s
Build & Release / Build Windows (push) Successful in 15m38s
Build & Release / Build Android (push) Successful in 30m30s
Build & Release / Create Release (push) Successful in 37s
One fix since v0.11.4: a video in a picture-in-picture window no longer drops to audio-only partway through, replaying from wherever the picture had been when the window opened. Two independent faults had to line up for it. The player's position variable is written only by a requestAnimationFrame loop while playing, and RAF stops for a document that is not being rendered -- which an Android activity behind a PiP window is not; the `timeupdate` handler that would have covered the gap had gated itself on `!isPlaying` since the first commit. And PiP and the background-audio handoff, nominally alternatives, could both be armed at once, with a single `isInPictureInPictureMode` sample taken inside onStop() standing between them. The frozen position was not confined to the handoff: the seek bar, resume points and the progress reported to Jellyfin all read the same variable, so all three stood still for as long as a PiP window was open. Version stamped with scripts/set-version.sh. defect-windows.md records DR-265 under the present-since/reachable-since gap: defective since v0.0.1, but only hittable once PiP started working on the HTML5 path in v0.5.3.
96 lines
3.8 KiB
Bash
96 lines
3.8 KiB
Bash
# Maintainer: Duncan Tourolle <duncan@tourolle.paris>
|
|
#
|
|
# 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.11.5
|
|
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"
|
|
}
|