Commit Graph
174 Commits
Author SHA1 Message Date
vicrodh 048fd37054 docs(qbzd): document the LAN-first bind and the token in the standalone README; posture line stops nagging gated setups
The public README never mentioned that the control API binds 0.0.0.0 by
default nor how to restrict it; the boot line also told users who had set
[server] token that anyone could control playback.

cc
2026-09-13 03:36:51 -06:00
vicrodh e291eb3af4 fix: stabilize playback memory, local library sync and Qt settings
Add shared playback memory profiles, bounded disk-backed playback and storage
selection for desktop and daemon. Preserve gapless during streaming-only playback
and provide explicit cache eviction with playback confirmation.

Stop watcher read events and unchanged scans from rebuilding the local catalog.
Restore playlist/sidebar updates, folder availability feedback and player layout.
Add appearance presets and a radio-based cache settings panel with translated
trade-offs, plus consistent clipboard menus across visible Qt text editors.

Validate with Rust regressions, QML interaction tests, isolated release startup
and idle-library checks; extend the shared local and CI gates.

cx
2026-09-13 02:57:21 -06:00
vicrodh 456e12e114 docs(release-2.1.1): add the 2026-09-11 batch to the notes and metainfo
Resizable panels (#771), collapsible My QBZ sidebar, artist identity
matching (#768), album-card editions, queue ordering (#442), custom artwork
on cards, GNOME clipboard (#684) and dock icon, MPRIS after restore (#683),
and the prebuilt-tarball flake (#744). Release date moved to 2026-09-11.

cc
2026-09-11 15:34:08 -06:00
vicrodh c82e624188 release: bump workspace version to 2.1.1
The About modal reads CARGO_PKG_VERSION, so it showed 2.1.0. Bump the workspace
version (and the Cargo.lock members) to 2.1.1 and add the 2.1.1 metainfo release
entry.

cc
2026-09-10 20:33:15 -06:00
vicrodh 95d5d532f3 chore(packaging): jack makedepends and Flathub runtime 6.11
- AUR qbz and qbzd: makedepends jack2 -> jack, so pipewire-jack can satisfy the
  build-time JACK dependency (both provide `jack`; only jack2 provides `jack2`).
- Flathub: bump runtime/SDK from the EOL org.kde.Platform 6.9 to 6.11 (verified
  available in the KDE flatpak-kde-runtime branches). The binary is built
  against Qt 6.8 and loads on 6.11 by forward ABI compatibility. (#755)

cc
2026-09-10 13:24:24 -06:00
vicrodh 0668868a28 packaging(aur): drop debuginfo from source PKGBUILDs
The qbz/qbzd source builds set only !lto; makepkg then injects -C
debuginfo=2 for its debug package, which inflates the final rustc link
enough to trip the OOM killer on the qbz-qt binary. Add !debug so the
source packages link within a normal builder's memory. Verified by
clean container builds of qbz and qbzd 2.1.0.

cc
2026-09-07 23:40:18 -06:00
vicrodh 02c4a6bdc0 docs: clarify QBZ scope and SACD notices for 2.1.0
Translate the project statement, document the implemented offline grace window, and link the bundled DST provenance and license notices. Align the release codename, ARM64 requirements and AppStream date.

cx
2026-09-06 19:20:54 -06:00
vicrodh 4bb4982312 feat(sacd): support raw and DST-compressed ISO playback
Parse resilient SACD images, decode DST, scan ISO releases into the local library, and keep explicit opens ephemeral.

Ship decoder notices across distribution formats and align DSD album filtering and version selection.

cx
2026-09-05 10:00:24 -06:00
vicrodh c7cee95ac2 merge: integrate artist library fixes into release branch
cx
2026-09-04 14:04:10 -06:00
vicrodh 4ac6b4006e feat(integrations): make the qobuzapp:// handler a setting
Claiming the official client's `qobuzapp://` scheme was a side effect
of installing. On Linux that displaces nobody; on macOS and Windows the
official client registers the same scheme, and on Windows — where QBZ
is only starting to be adopted — taking the browser's links over at
install time is not a reasonable default. `qbz://` (our own scheme)
stays registered unconditionally.

Settings > Integrations > "Open Qobuz links in QBZ" (link_handler_qt,
pref `qobuz_links_enabled` beside the other Integrations opt-ins),
default on for Linux/macOS and OFF on Windows. The registration moves
only when the toggle is flipped; the one startup reconciliation is
conservative — a claim pointing at this executable while the setting is
off (the 2.0.x MSI wrote one) is dropped, nothing is ever claimed on its
own.

Windows writes/removes HKCU\Software\Classes\qobuzapp (deleting only a
tree whose command names this exe); macOS uses Launch Services and hands
the default back to the first other handler on off; Linux runs xdg-mime
on. The MSI no longer registers qobuzapp and the workflow's protocol
checks cover qbz only. The Windows and macOS arms build on their
platform gates, not on this box.

cc
2026-09-04 13:10:42 -06:00
vicrodh 3bce452f6d fix(packaging): prevent qbz and qbzd file conflicts
cx
2026-09-04 10:45:52 -06:00
vicrodh a9a849c1ec fix(packaging): harden Snap release inputs
cx
2026-09-04 09:16:10 -06:00
vicrodh 41fb509f09 fix(packaging): align Flatpak permissions and assets
cx
2026-09-04 09:16:04 -06:00
vicrodh 0d1cdb5e89 feat(packaging): complete Linux release assets
cx
2026-09-04 09:06:02 -06:00
vicrodh ad9378e1d1 feat(packaging): add complete Gentoo package set
cx
2026-09-04 09:05:19 -06:00
vicrodh 56059e6814 feat(packaging): add complete AUR package set
cx
2026-09-04 08:27:17 -06:00
vicrodh c85908e262 docs(qbzd): document non-systemd services
cx
2026-09-04 08:27:05 -06:00
vicrodh 7627ac7a36 docs(release): prepare 2.1.0 notes and packaging
cx
2026-09-01 20:12:53 -06:00
vicrodh 53a77791c6 fix(windows): zero the safe-area paddings on Windows too
The Qt 6.9 SafeArea padding neutralizer was gated to macOS in eada3bd12,
which was correct THEN — the Windows ExpandedClientAreaHint arm did not
exist yet. 415cba57d added it without widening the gate, so on Windows
the caption-height safe-area margin auto-padded the contentItem down and
the strip rendered with the window's #1a1a1a background: a dark grey bar
above the QBZ header, pushing the drawn window controls down with it.
The Loader stays imperative, so Linux/Qt 6.8 still never instantiates it.

cc
2026-09-01 07:45:45 -06:00
vicrodh 4f065eb45f chore(release): bump workspace version to 2.1.0
Workspace version + lock, and the metainfo gains its 2.1.0 release entry
(the release workflow re-stamps version and date at tag time). flake.nix
and the Flathub manifest are post-tag and stay untouched; the snap-qt
recipe stamps its version from the tag.

cc
2026-08-31 11:39:20 -06:00
vicrodh 783dbb964e fix(windows): make MSI authoring valid on WiX 5
cx
2026-08-28 09:44:25 -06:00
vicrodh aaf9573c57 fix(ci): harden Gentoo overlay publishing
cx
2026-08-28 09:44:25 -06:00
vicrodh ac506e4d6c fix(ci): harden AUR release publishing
cx
2026-08-28 09:44:25 -06:00
vicrodh 9a0dbd60c2 fix(ci): use pre-OSMF WiX for Windows packaging
cx
2026-08-28 09:44:25 -06:00
vicrodh 912638c387 merge: integrate Windows port from PR #725
cx
2026-08-28 04:18:06 -06:00
vicrodh 975c00282b fix(snap): ship PipeWire routing tools
cx
2026-08-27 20:18:18 -06:00
vicrodh 6bfeb88c3f docs(qbzd): cover appliance and read-only deployment
cx
2026-08-27 19:51:03 -06:00
vicrodh 8fb02401fc ci(windows): release workflow, WiX authoring, LGPL notices
Mirrors release-macos.yml step for step: aqt MSVC Qt, cargo build -p qbz-qt,
windeployqt --qmldir, the offscreen smoke with the Qt install hidden, a WiX 7
MSI, a portable zip and the PDB. Unsigned by decision (D4).

The MSI carries the identity the app cannot give itself. Its Start-menu
shortcut sets System.AppUserModel.ID, and a matching
Software\Classes\AppUserModelId key is written beside it: Windows resolves an
unpackaged app's AppUserModelID through EITHER, and without one of them it
drops every toast without a word. The URL protocols qbz:// and qobuzapp:// are
registered the same way, the analogue of CFBundleURLSchemes.

The NASM step stays. Measured on the box: aws-lc-sys 0.39.1 uses real NASM --
its shipped prebuilt objects are only used when nasm is ABSENT -- and without
either the build fails hard with "Missing dependency: nasm". Switching rustls
to ring would drop the requirement but would change the crypto provider on
Linux and macOS too, which is a project decision and not a port's to make.

The Qt LGPL text now travels with every artifact that bundles Qt, verbatim from
gnu.org, alongside a notice naming the pinned version, the modules actually
present in a release build, where the sources are, and why relinking is a file
copy here (dynamic linking, DLLs beside the exe, no static build, no qt.conf
prefix rewrite).

Not dispatched: HARD RULE 4 makes that the owner's call.

cc
2026-08-27 17:00:09 -06:00
vicrodh 7135c841cb build(windows): embed the icon, VERSIONINFO and a longPathAware manifest
winresource, not winres: winres has been unmaintained since 2021 and this
is its maintained fork. Gated to cfg(windows) as a target build-dependency,
so no other platform resolves it at all.

The manifest declares longPathAware and NOTHING else. Qt 6 sets
PerMonitorV2 itself at startup and a manifest DPI declaration is immutable,
so the two together either log a permanent COM error 0x5 or degrade
scaling - Qt owns DPI awareness.

The .ico carries 256/128/64/48/32. The four small entries are BMP and only
256 is PNG: measured on this box, System.Drawing.Icon (GDI+) throws
ArgumentOutOfRangeException in ToBitmap() on a PNG-payload entry, while WIC
decodes it. 256 has to be PNG because the directory encodes its size as 0.
Pixels verified against the source PNG at four points including an
asymmetric one, which is what proves the BGRA order and the bottom-up flip.

cc
2026-08-27 03:46:29 -06:00
vicrodh 04fd94d41a packaging: Qt dependencies for the flake, AUR and Gentoo
flake builds -p qbz-qt against nixpkgs qt6 with wrapQtAppsHook; the
AUR PKGBUILD and the Gentoo binary ebuild add qt6-base/qtdeclarative
>= 6.8 (both distros ship 6.9), since their tarball carries the bare
binary.

cc
2026-08-26 19:11:01 -06:00
vicrodh c6bfb90ede ci: flatpak bundle repacks the bare binary on the KDE runtime
org.kde.Platform 6.9 provides Qt above the 6.8 floor; the manifest no
longer runs cargo, needs no rust/llvm SDK extensions and no swap. The
workflow takes the binary from build-qt-linux.yml, builds qbzd
alongside, and boots the installed bundle offscreen inside the sandbox
before publishing. Same shape as the Flathub manifest.

cc
2026-08-26 19:11:01 -06:00
vicrodh 89030b5b2a ci: snap packs the AppDir; remove the Launchpad source recipe
core24 ships Qt 6.4.2 and the tree needs 6.8, so neither stage-packages
nor a remote source build can provide Qt: the dump recipe now takes the
AppDir tree from build-qt-linux.yml (both arches) and the root
snapcraft.yaml plus its packaging/snap symlink are deleted. snap-slint
becomes snap-qt with the non-Qt runtime only.

cc
2026-08-26 19:11:01 -06:00
vicrodh 149c021e47 ci: rewrite release-linux and aarch64 around the Qt build
Both call build-qt-linux.yml. deb/rpm/AppImage are packed from the
AppDir (Qt bundled under /opt/qbz, /usr/bin/qbz symlink, RPATH and
qt.conf resolve through /proc/self/exe — no wrapper, which would leak
LD_LIBRARY_PATH into spawned processes); the AUR/Gentoo/Flathub tarball
keeps the bare binary. Every published file name is unchanged. Adds the
gate that no workflow builds `-p qbz` (the frozen Slint bin shares the
name and target dir). The two files differ only in the ARCH block.

cc
2026-08-26 19:11:01 -06:00
vicrodh 8b77f1ae08 feat(macos): add Liquid Glass app icon source
cx
2026-08-26 12:32:02 -06:00
vicrodh 3b3ff54964 feat(packaging): ship an optional KWin rule to keep the miniplayer above
Measured, not assumed: under XWayland the same Qt hint DOES set
_NET_WM_STATE_ABOVE and KWin honours it, so always-on-top is not impossible —
it is only impossible for the app to ASK for it on Wayland, where no such
request exists in the core protocol.

So the app stops claiming it can pin itself and instead ships the thing that
works: a window rule matching the miniplayer by its stable, never-translated
title, narrowed by wmclass so no other app's window picks it up. The main
window is titled "QBZ", which is why the title match is exact rather than a
substring.

OPTIONAL and never applied by an installer. It is the user's window manager
and their configuration; a package that silently rewrote kwinrulesrc would be
a worse citizen than one that ships a file and a sentence of documentation.
The rationale, the two rejected routes and the import steps are in
qbz-nix-docs/qt-frontend/2026-08-04-miniplayer-keep-above-kwin.md.

cc
2026-08-04 14:56:37 -06:00
vicrodh efa486ba4f feat(packaging+log): standalone qbzd packages, IP masking in logs
- nfpm-qbzd.yaml (deb/rpm, libasound-only dep) + release workflows build
  the standalone qbzd packages per arch; dual dispatch to the future
  qbz-rpm repo (continue-on-error until token scope lands).
- Gentoo overlay templates: qbzd (source build) + qbzd-bin (tarball
  repack) with systemd user unit + completions.
- Log redaction layer 3: IPv4 -> *.*.*.<last>, IPv6 -> *:*:<last>, with
  version/timestamp false-positive guards (qbz-log 10/10 tests).

km
2026-07-25 12:05:56 -06:00
vicrodh 299a7c3237 chore(packaging): drop dead x-scheme-handler/qbz registration
qbz:// resolves nowhere in the link resolver, so the registration
advertised a scheme the app never handles. Keep
x-scheme-handler/qobuzapp (handled by the resolver) in all 7 desktop
files.

km
2026-07-22 22:56:14 -06:00
vicrodh cb10d42b53 chore(flatpak): drop the org.freedesktop.secrets talk-name from the twin
Parity with the published Flathub manifest (repack flow, PR #49), which
already ships without it. The Flathub repo manifest is untouched.

km
2026-07-22 16:53:54 -06:00
vicrodh f9713591fe chore: bump version to 2.0.2
Workspace version 2.0.1 -> 2.0.2 (Cargo.toml + lock, workspace crates only —
no dependency re-resolution), a new metainfo <release> entry, and the release
docs: TAG_DETAILS.md (human-facing, About-modal/website format, 2.0.2 section
prepended above 2.0.1/2.0.0) + CHANGELOG.md (full detail since v2.0.1 — the
headless daemon, kiosk mode, dynamic background, cast/quality #638, audio,
rendering #617, library, themes and security work). Codename inherited on the
patch line; About-modal literal untouched.

cc
2026-07-20 19:49:09 -06:00
vicrodh f778874fdd fix(audio): #508 ALSA-exclusive + streaming regression; flatpak ReserveDevice1 own-name
Store the CMAF duration at command-accept so the seek bar and progress can't
freeze at 0:00, backfill it on the Resume rebuild, and clear + surface the
zombie stream-create-failure path. Degrade every non-priority device-reservation
contention error (only a higher-priority holder stays fatal) so a sandboxed
D-Bus RequestName denial can't block bit-perfect playback. Honor the
stream_buffer_seconds floor in the dynamic CMAF path and wire the network
throttle (record_segment_bandwidth / record_underrun / prefetch cap) to tame the
#591 underrun loop. Grant --own-name=org.freedesktop.ReserveDevice1.* in the
repo flatpak manifest so WirePlumber releases the card cleanly.

cc
2026-07-16 16:29:58 -06:00
vicrodh 601188a2c0 ci: build qbzd on ubuntu-22.04 with slint-free and glibc-floor gates
cc
2026-07-14 21:12:21 -06:00
vicrodh 39eb12fc45 feat(packaging): ship qbzd binary and user unit in deb/rpm and tarball
cc
2026-07-14 21:02:34 -06:00
vicrodh a9949b8cf2 chore: fix stale packaging and monitor references to the deleted tree
cc
2026-07-10 01:05:47 -06:00
vicrodh 207d928fd8 ci(snap): add an arm64 track to release-snap (native runner, dump repack)
Both arches now publish from CI: the existing amd64 track plus a new
build-binary-arm64 (native ubuntu-24.04-arm, free for public repos, reuses
release-linux-aarch64's cargo cache) -> snap-arm64 that dumps the prebuilt
aarch64 binary with packaging/snap-slint/snapcraft-arm64.yaml. This CI upload
is the sole publish path; Launchpad / "Build from GitHub" is not used.

cc
2026-07-09 08:13:58 -06:00
vicrodh 7ea9e2567b chore: bump version to 2.0.1
Workspace + lockfiles, the dead-Tauri consistency version fields, the metainfo
<release> entry, and the release docs (TAG_DETAILS.md / CHANGELOG.md).

The About-modal codename and the TAG_DETAILS h1 are left as __CODENAME__ /
__SUBTITLE__ placeholders on purpose — the owner names the release before the
tag (2.0.0 was "Rebuild 破 (You Can (Not) Advance)").

cc
2026-07-08 18:43:27 -06:00
vicrodh 54bb2c96a0 fix(gentoo): RESTRICT mirror+strip in the binary ebuild template
Without RESTRICT=mirror Portage walks every official Gentoo mirror
(guaranteed 404s — the distfiles only exist on GitHub Releases) before
falling back to SRC_URI. The source template already had it.

cc
2026-07-04 17:37:28 -06:00
vicrodh 0d1a9b96f6 fix(ci): nfpm does not expand env vars in contents src paths
Pre-flight caught it: the deb/rpm step failed with the literal
'Glob failed: ${QBZ_BINARY}: no matching files'. The workflow already
places the stripped binary at ./qbz, so the manifest now uses the
literal path.

cc
2026-07-04 02:56:12 -06:00
vicrodh 400637bf6d fix(ci): apply the pending release-pipeline review fixes
Restores the ALSA layout binds in both snap recipes (bit-perfect hw:
access inside the snap), lets the build cache save on main as well as
slint-mvp, installs the desktop file as com.blitzfc.qbz.desktop so the
AppStream launchable and the MPRIS DesktopEntry resolve in deb/rpm,
clears the stale boot-restore error when a new browser sign-in starts,
and adds the X11 dlopen libraries to the flake's runtime set. The
flake version/rev/srcHash bump remains a tag-time step (documented in
the release checklist, which is rewritten for the 2.0 Slint flow).

cc
2026-07-03 18:46:37 -06:00
vicrodh 7252918d4d chore: bump version to 2.0.0
QBZ 2.0 "Rebuild". Workspace, Tauri manifests, npm manifests and the
Flatpak metainfo all move to 2.0.0; TAG_DETAILS for the release notes.
snapcraft.yaml uses version: git and needs no bump.

cc
2026-07-03 18:36:06 -06:00
vicrodh 058d38c8d2 chore(packaging): point channel packagers at the Slint build
Flatpak manifest builds the crates/ workspace with rust-stable+llvm20
(node SDK and the intltool/libdbusmenu/ayatana chain removed). Root
snapcraft.yaml becomes a from-source Slint recipe (core24, rustup,
MIN memory tier) mirroring packaging/snap-slint runtime sections.
AUR/arch/gentoo swap webkit/gtk/appindicator runtime deps for the
measured Slint set and the source builders compile crates/ directly.
flake.nix: cargoRoot crates, no npm hooks, dlopen runtime libs wrapped.

cc
2026-07-02 10:11:16 -06:00