mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-22 14:35:41 +00:00
chore(release): v1.34.21 — macOS updater UI fix + second test build
- AppUpdater.tsx: macOS now has a dedicated branch in the update modal —
no architecture-specific DMG asset shown (the Tauri Updater picks the
right platform from latest.json), clearer wording ("Downloads, verifies
and installs automatically"), and the primary button reads "Install
now" instead of "Download". Strings use defaultValue so locales without
the key fall back to English until translations catch up.
- Test release for the updater pipeline; CHANGELOG entry asks users to
ignore it. Will be deleted after the test.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -9,6 +9,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
>
|
>
|
||||||
> **🎉 macOS users:** Starting with **v1.34.15**, Psysonic can **update itself silently**. No more DMG downloading and dragging to Applications — the updater fetches the signed `.app` bundle, verifies the signature, replaces the app in place, and relaunches. Just click "Update" when the toast appears.
|
> **🎉 macOS users:** Starting with **v1.34.15**, Psysonic can **update itself silently**. No more DMG downloading and dragging to Applications — the updater fetches the signed `.app` bundle, verifies the signature, replaces the app in place, and relaunches. Just click "Update" when the toast appears.
|
||||||
|
|
||||||
|
## [1.34.21] - 2026-04-18
|
||||||
|
|
||||||
|
> ### ⚠️ PLEASE IGNORE THIS RELEASE — TEST BUILD ONLY
|
||||||
|
>
|
||||||
|
> **This is a throwaway test build used to verify the macOS auto-updater pipeline end-to-end. There are no new features, no bug fixes, no changes of any kind that affect how Psysonic behaves for end users — only the version number, plus a small UI polish in the update notification on macOS.**
|
||||||
|
>
|
||||||
|
> **This release will be deleted within a day or two.** Do not download it, do not rely on it, do not link to it. Stay on whatever version you currently have installed; normal releases will resume shortly under the regular versioning scheme.
|
||||||
|
>
|
||||||
|
> Thanks for your patience while we stabilise the updater infrastructure.
|
||||||
|
|
||||||
## [1.34.20] - 2026-04-18
|
## [1.34.20] - 2026-04-18
|
||||||
|
|
||||||
> ### ⚠️ PLEASE IGNORE THIS RELEASE — TEST BUILD ONLY
|
> ### ⚠️ PLEASE IGNORE THIS RELEASE — TEST BUILD ONLY
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "psysonic",
|
"name": "psysonic",
|
||||||
"version": "1.34.20",
|
"version": "1.34.21",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
Generated
+1
-1
@@ -3653,7 +3653,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "psysonic"
|
name = "psysonic"
|
||||||
version = "1.34.20"
|
version = "1.34.21"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"biquad",
|
"biquad",
|
||||||
"discord-rich-presence",
|
"discord-rich-presence",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "psysonic"
|
name = "psysonic"
|
||||||
version = "1.34.20"
|
version = "1.34.21"
|
||||||
description = "Psysonic Desktop Music Player"
|
description = "Psysonic Desktop Music Player"
|
||||||
authors = []
|
authors = []
|
||||||
license = ""
|
license = ""
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "Psysonic",
|
"productName": "Psysonic",
|
||||||
"version": "1.34.20",
|
"version": "1.34.21",
|
||||||
"identifier": "dev.psysonic.player",
|
"identifier": "dev.psysonic.player",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "npm run dev",
|
"beforeDevCommand": "npm run dev",
|
||||||
|
|||||||
@@ -159,6 +159,10 @@ export default function AppUpdater() {
|
|||||||
|
|
||||||
const asset = pickAsset(release.assets);
|
const asset = pickAsset(release.assets);
|
||||||
const showAurHint = IS_LINUX && isArch;
|
const showAurHint = IS_LINUX && isArch;
|
||||||
|
// On macOS the Tauri Updater handles architecture, signature verification
|
||||||
|
// and in-place install — we don't need (and should not show) a DMG asset.
|
||||||
|
const useTauriUpdater = IS_MACOS;
|
||||||
|
const showInstallBtn = !showAurHint && (useTauriUpdater || !!asset);
|
||||||
|
|
||||||
const handleSkip = () => {
|
const handleSkip = () => {
|
||||||
localStorage.setItem(SKIP_KEY, release.version);
|
localStorage.setItem(SKIP_KEY, release.version);
|
||||||
@@ -309,6 +313,40 @@ export default function AppUpdater() {
|
|||||||
<code className="update-modal-aur-cmd">yay -S psysonic-bin</code>
|
<code className="update-modal-aur-cmd">yay -S psysonic-bin</code>
|
||||||
<code className="update-modal-aur-cmd update-modal-aur-alt">sudo pacman -Syu psysonic-bin</code>
|
<code className="update-modal-aur-cmd update-modal-aur-alt">sudo pacman -Syu psysonic-bin</code>
|
||||||
</div>
|
</div>
|
||||||
|
) : useTauriUpdater ? (
|
||||||
|
<>
|
||||||
|
{dlState === 'idle' && (
|
||||||
|
<div className="update-modal-asset">
|
||||||
|
<span className="update-modal-asset-name">
|
||||||
|
{t('common.updaterMacReady', {
|
||||||
|
defaultValue: 'Downloads, verifies and installs automatically. The app will restart when done.',
|
||||||
|
})}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{dlState === 'downloading' && (
|
||||||
|
<div className="update-modal-progress">
|
||||||
|
<div className="app-updater-progress-bar">
|
||||||
|
<div className="app-updater-progress-fill" style={{ width: `${pct}%` }} />
|
||||||
|
</div>
|
||||||
|
<span className="app-updater-pct">{pct}%</span>
|
||||||
|
<span className="update-modal-dl-bytes">
|
||||||
|
{fmtBytes(dlProgress.bytes)}
|
||||||
|
{dlProgress.total > 0 && ` / ${fmtBytes(dlProgress.total)}`}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{dlState === 'done' && (
|
||||||
|
<div className="update-modal-done">
|
||||||
|
<div className="update-modal-done-title">
|
||||||
|
{t('common.updaterMacDone', { defaultValue: 'Installed. Restarting…' })}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{dlState === 'error' && (
|
||||||
|
<div className="app-updater-error">{dlError || t('common.updaterErrorMsg')}</div>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
) : asset ? (
|
) : asset ? (
|
||||||
<>
|
<>
|
||||||
{dlState === 'idle' && (
|
{dlState === 'idle' && (
|
||||||
@@ -365,10 +403,12 @@ export default function AppUpdater() {
|
|||||||
<button className="btn btn-surface" onClick={() => setDismissed(true)}>
|
<button className="btn btn-surface" onClick={() => setDismissed(true)}>
|
||||||
{t('common.updaterRemindBtn')}
|
{t('common.updaterRemindBtn')}
|
||||||
</button>
|
</button>
|
||||||
{!showAurHint && asset && dlState === 'idle' && (
|
{showInstallBtn && dlState === 'idle' && (
|
||||||
<button className="btn btn-primary" onClick={handleDownload}>
|
<button className="btn btn-primary" onClick={handleDownload}>
|
||||||
<Download size={14} />
|
<Download size={14} />
|
||||||
{t('common.updaterDownloadBtn')}
|
{useTauriUpdater
|
||||||
|
? t('common.updaterInstallNow', { defaultValue: 'Install now' })
|
||||||
|
: t('common.updaterDownloadBtn')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
{dlState === 'error' && (
|
{dlState === 'error' && (
|
||||||
|
|||||||
Reference in New Issue
Block a user