Merge branch 'main' into feature/shuffle

This commit is contained in:
Siiiiinth
2026-02-01 12:03:00 +01:00
17 changed files with 113 additions and 72 deletions
+1 -1
View File
@@ -33,7 +33,7 @@ jobs:
run: export C_INCLUDE_PATH=/usr/local/include:/opt/homebrew/include:$C_INCLUDE_PATH && export LIBRARY_PATH=/usr/local/lib:/opt/homebrew/lib:$LIBRARY_PATH
- name: Install Fyne tool
run: go install fyne.io/fyne/v2/cmd/fyne@latest
run: go install fyne.io/tools/cmd/fyne@latest
- name: Package app bundles
run: >
+1 -1
View File
@@ -33,7 +33,7 @@ jobs:
run: export C_INCLUDE_PATH=/usr/local/include:/opt/homebrew/include:$C_INCLUDE_PATH && export LIBRARY_PATH=/usr/local/lib:/opt/homebrew/lib:$LIBRARY_PATH
- name: Install Fyne tool
run: go install fyne.io/fyne/v2/cmd/fyne@latest
run: go install fyne.io/tools/cmd/fyne@latest
- name: Build and package app bundles
run: >
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
run: sudo apt update && sudo apt install libmpv-dev gcc libegl1-mesa-dev xorg-dev
- name: Install Fyne tool
run: go install fyne.io/fyne/v2/cmd/fyne@latest
run: go install fyne.io/tools/cmd/fyne@latest
- name: Fyne package
run: make package_linux
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
run: sudo apt update && sudo apt install libmpv-dev gcc libegl1-mesa-dev xorg-dev
- name: Install Fyne tool
run: go install fyne.io/fyne/v2/cmd/fyne@latest
run: go install fyne.io/tools/cmd/fyne@latest
- name: Fyne package
run: make package_linux
+1 -1
View File
@@ -39,7 +39,7 @@ jobs:
pacman --noconfirm -S mingw-w64-x86_64-toolchain mingw-w64-x86_64-mpv
- name: Install Fyne tool
run: go install fyne.io/fyne/v2/cmd/fyne@latest
run: go install fyne.io/tools/cmd/fyne@latest
- name: Package
run: make package_windows
+21
View File
@@ -1,5 +1,26 @@
# Change Log
## [0.20.1]
### Added
- Improved translations for Chinese, Japanese, Italian
- [#814](https://github.com/dweymouth/supersonic/pull/814) Setting to disable fade out on pause
### Changed
- [#798](https://github.com/dweymouth/supersonic/issues/798) Ignore SSL validation setting migrated to per-server option
### Fixed
- [#614](https://github.com/dweymouth/supersonic/issues/614) Some uPnP devices not recognized
- [#809](https://github.com/dweymouth/supersonic/issues/809) Jellyfin synced lyrics not shown as synced if first line starts at 00:00.00
- [#804](https://github.com/dweymouth/supersonic/issues/804) Regression in peak meter animation smoothness
- Some optimizations of tracklist rendering
- [#810](https://github.com/dweymouth/supersonic/issues/810) Autoplay tracks enqueuing too early
- [#834](https://github.com/dweymouth/supersonic/pull/834) Fix equalizer filter string for ffmpeg
- [#813](https://github.com/dweymouth/supersonic/issues/813) Unnecessarily large minimum window width for pages with tracklist
- [#485](https://github.com/dweymouth/supersonic/discussions/485) Use sort tags for sorting artist discography by album name (OpenSubsonic only)
- [#384](https://github.com/dweymouth/supersonic/issues/384) for Jellyfin - Add to Playlist dialog not showing playlists when logged in with username in different case
- Fix Now Playing background dissolve animation when next track has same cover art as previous
## [0.20.0]
### Added
+1 -1
View File
@@ -1,7 +1,7 @@
[Details]
Icon = "res/appicon-512.png"
Name = "Supersonic"
Version = "0.20.0"
Version = "0.20.1"
[LinuxAndBSD]
Categories = ["Audio", "AudioVideo"]
+1 -1
View File
@@ -8,7 +8,7 @@
[![Last Release](https://img.shields.io/github/v/release/dweymouth/supersonic?logo=github&label=latest&style=flat)](https://github.com/dweymouth/supersonic/releases)
[![Downloads](https://img.shields.io/github/downloads/dweymouth/supersonic/total?logo=github&style=flat)](https://github.com/dweymouth/supersonic/releases/latest)
[![Go Report Card](https://goreportcard.com/badge/github.com/dweymouth/supersonic)](https://goreportcard.com/report/github.com/dweymouth/supersonic)
<a href="https://discord.gg/VqmW48aZMh"><img src="https://dcbadge.vercel.app/api/server/VqmW48aZMh" width="20%"/></a>
[![Discord](https://dcbadge.limes.pink/api/server/H6FC9bAMpF?style=flat)](https://discord.gg/H6FC9bAMpF)
A lightweight cross-platform desktop client for Subsonic and Jellyfin music servers.
+2 -2
View File
@@ -48,7 +48,7 @@ require (
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 // indirect
github.com/go-text/render v0.2.0 // indirect
github.com/go-text/typesetting v0.3.2 // indirect
github.com/go-text/typesetting v0.3.3-0.20260117213729-06c64e10eb0b // indirect
github.com/h2non/filetype v1.1.3 // indirect
github.com/hack-pad/go-indexeddb v0.3.2 // indirect
github.com/hack-pad/safejs v0.1.1 // indirect
@@ -68,7 +68,7 @@ require (
gopkg.in/yaml.v3 v3.0.1 // indirect
)
replace fyne.io/fyne/v2 v2.7.2 => github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20260121163844-a0f2c1dd0601
replace fyne.io/fyne/v2 v2.7.2 => github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20260131034631-53eb7128ebc8
replace github.com/go-audio/wav v1.1.0 => github.com/dweymouth/go-wav v0.0.0-20250719173115-e60429a83eb0
+4 -4
View File
@@ -26,8 +26,8 @@ github.com/dweymouth/fyne-advanced-list v0.0.0-20250211191927-58ea85eec72c h1:UX
github.com/dweymouth/fyne-advanced-list v0.0.0-20250211191927-58ea85eec72c/go.mod h1:Idgzr4LYzve8IPHF1stLO1bdGQZnDKt/bT9WfJflCGw=
github.com/dweymouth/fyne-tooltip v0.4.0 h1:ZkMhy4f8lHklyjNnKJlSEJ2pLPnYWVD7tu2+YEgmp+w=
github.com/dweymouth/fyne-tooltip v0.4.0/go.mod h1:jXYbY561DTIXXqkauzltI3o/hsVaQd2KY8Ry2FXy7Xk=
github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20260121163844-a0f2c1dd0601 h1:Z75H0KinbkuXn0y/+vFB4R6jvwgwHkgCivvPT5fIYcc=
github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20260121163844-a0f2c1dd0601/go.mod h1:M3Fkb8eUU6se8E+coikK8x7f3vCIakxAW7bPyw3d9fA=
github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20260131034631-53eb7128ebc8 h1:lwx4mANwRNH25jj2n/IAFUQ5XuYhBaj18OEPvDP19Ns=
github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20260131034631-53eb7128ebc8/go.mod h1:kjf8HBnGLLykRyRX1mAHLYAfuBaY0oSx6XKCr/dzkOg=
github.com/dweymouth/go-jellyfin v0.0.0-20250928223159-bd2fb9681ef5 h1:Or5VJodg7cGmdnBIcS+FrEH0twBi7mZsFCz6V0vCOQI=
github.com/dweymouth/go-jellyfin v0.0.0-20250928223159-bd2fb9681ef5/go.mod h1:fcUagHBaQnt06GmBAllNE0J4O/7064zXRWdqnTTtVjI=
github.com/dweymouth/go-wav v0.0.0-20250719173115-e60429a83eb0 h1:mYcctuWgVArHhSLJxndlUM43C3hoE18BLDBkXKM2tl0=
@@ -62,8 +62,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 h1:RkGhqHxEVA
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc=
github.com/go-text/render v0.2.0 h1:LBYoTmp5jYiJ4NPqDc2pz17MLmA3wHw1dZSVGcOdeAc=
github.com/go-text/render v0.2.0/go.mod h1:CkiqfukRGKJA5vZZISkjSYrcdtgKQWRa2HIzvwNN5SU=
github.com/go-text/typesetting v0.3.2 h1:OUOFxp9Rx5PiO0/rh2IY+5gmyXjXsVG8+LfEyk9NMcE=
github.com/go-text/typesetting v0.3.2/go.mod h1:vIRUT25mLQaSh4C8H/lIsKppQz/Gdb8Pu/tNwpi52ts=
github.com/go-text/typesetting v0.3.3-0.20260117213729-06c64e10eb0b h1:8jK9akFlw57u1DyVu6Vr+SUjvnYQkns9roj653VJ4iM=
github.com/go-text/typesetting v0.3.3-0.20260117213729-06c64e10eb0b/go.mod h1:vIRUT25mLQaSh4C8H/lIsKppQz/Gdb8Pu/tNwpi52ts=
github.com/go-text/typesetting-utils v0.0.0-20250618110550-c820a94c77b8 h1:4KCscI9qYWMGTuz6BpJtbUSRzcBrUSSE0ENMJbNSrFs=
github.com/go-text/typesetting-utils v0.0.0-20250618110550-c820a94c77b8/go.mod h1:3/62I4La/HBRX9TcTpBj4eipLiwzf+vhI+7whTc9V7o=
github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=
+15 -16
View File
@@ -63,36 +63,35 @@
</screenshots>
<releases>
<release date="2026-01-10" version="0.20.0">
<release date="2026-01-31" version="0.20.1">
<description>
<p>
Version 0.20.0 of Supersonic
Version 0.20.1 of Supersonic
</p>
<p>
Added
</p>
<ul>
<li>Quickly fade out audio when pausing</li>
<li>Add collapsed/compact view for page headers</li>
<li>Add option to prevent screensaver or screen sleep on Now Playing page</li>
<li>Add lyrics tab to sidebar</li>
<li>Add additional tracklist columns for Genre, Album Artist, File Type, Date Added</li>
<li>Show year on Now Playing page</li>
<li>Option to round image corners throughout app</li>
<li>Option to used blurred album cover for background of Now Playing page</li>
<li>Left click on system tray icon raises app window</li>
<li>Button in Advanced tab of settings window to clear caches</li>
<li>Seeking Next while playing the last track in queue now cycles around back to the beginning</li>
<li>Behavior and naming of "Stop after current track" changed to "Pause after current track"</li>
<li>Improved translations for Chinese, Japanese, Italian</li>
<li>Setting to disable fade out on pause</li>
<li>Ignore SSL validation setting migrated to per-server option</li>
</ul>
<p>
Fixed
</p>
<ul>
<li>LrcLib fetcher no longer crashes on tracks with no artist name</li>
<li>Windows now playing notifications are now silent, and include album cover</li>
<li>Some uPnP devices not recognized</li>
<li>Jellyfin synced lyrics not shown as synced if first line starts at 00:00.00</li>
<li>Regression in peak meter animation smoothness</li>
<li>Some optimizations of tracklist rendering</li>
<li>Autoplay tracks enqueuing too early</li>
<li>Fix equalizer filter string for ffmpeg</li>
<li>Unnecessarily large minimum window width for pages with tracklist</li>
<li>Use sort tags for sorting artist discography by album name (OpenSubsonic only)</li>
<li>For Jellyfin - Add to Playlist dialog not showing playlists when logged in with username in different case</li>
<li>Fix Now Playing background dissolve animation when next track has same cover art as previous</li>
</ul>
</description>
+14 -15
View File
@@ -3,7 +3,7 @@ package res
const (
AppName = "supersonic"
DisplayName = "Supersonic"
AppVersion = "0.20.0"
AppVersion = "0.20.1"
AppVersionTag = "v" + AppVersion
ConfigFile = "config.toml"
GithubURL = "https://github.com/dweymouth/supersonic"
@@ -15,21 +15,20 @@ const (
var (
WhatsAdded = `
## Added
* Quickly fade out audio when pausing
* Add collapsed/compact view for page headers
* Add option to prevent screensaver or screen sleep on Now Playing page
* Add lyrics tab to sidebar
* Add additional tracklist columns for Genre, Album Artist, File Type, Date Added
* Show year on Now Playing page
* Option to round image corners throughout app
* Option to used blurred album cover for background of Now Playing page
* Left click on system tray icon raises app window
* Button in Advanced tab of settings window to clear caches
* Seeking Next while playing the last track in queue now cycles around back to the beginning
* Behavior and naming of "Stop after current track" changed to "Pause after current track"`
* Improved translations for Chinese, Japanese, Italian
* Setting to disable fade out on pause
* Ignore SSL validation setting migrated to per-server option`
WhatsFixed = `
## Fixed
* LrcLib fetcher no longer crashes on tracks with no artist name
* Windows now playing notifications are now silent, and include album cover`
* Some uPnP devices not recognized
* Jellyfin synced lyrics not shown as synced if first line starts at 00:00.00
* Regression in peak meter animation smoothness
* Some optimizations of tracklist rendering
* Autoplay tracks enqueuing too early
* Fix equalizer filter string for ffmpeg
* Unnecessarily large minimum window width for pages with tracklist
* Use sort tags for sorting artist discography by album name (OpenSubsonic only)
* For Jellyfin - Add to Playlist dialog not showing playlists when logged in with username in different case
* Fix Now Playing background dissolve animation when next track has same cover art as previous`
)
+12 -12
View File
@@ -4,7 +4,7 @@
"Add Server": "添加服务器",
"Add to playlist": "添加到播放列表",
"Add to queue": "添加到队列",
"Advanced": "Advanced",
"Advanced": "高级",
"Album": "专辑",
"Album Count": "专辑数量",
"Album artist": "专辑艺术家",
@@ -57,7 +57,7 @@
"Compilation": "合集",
"Compilations": "合集",
"Composer": "作曲家",
"Composers": "Composers",
"Composers": "作曲家",
"Configure your music server to add radio stations": "配置您的音乐服务器以添加电台",
"Confirm Delete Playlist": "确认删除播放列表",
"Confirm Delete Server": "确认删除服务器",
@@ -92,9 +92,9 @@
"Equalizer": "均衡器",
"Error": "错误",
"Error creating playlist": "创建播放列表时出错",
"Error updating playlist": "Error updating playlist",
"Error updating playlist": "更新播放列表时出错",
"Exclusive mode": "独占模式",
"Fade out on pause": "Fade out on pause",
"Fade out on pause": "暂停时淡出",
"Fav.": "收藏",
"Favorites": "收藏",
"Feb": "二月",
@@ -133,7 +133,7 @@
"Lyrics": "歌词",
"Lyrics not available": "歌词不可用",
"Mar": "三月",
"Maximum image cache size": "Maximum image cache size",
"Maximum image cache size": "最大图像缓存大小",
"May": "五月",
"Menu": "菜单",
"Mixtape": "混音带",
@@ -177,9 +177,9 @@
"Prevent clipping": "防止削波",
"Prevent screensaver on Now Playing page": "禁止在“正在播放”页面显示屏幕保护程序",
"Previous": "上一个",
"Private playlist by": "私人 播放列表作者",
"Public": "Public",
"Public playlist by": "公开 播放列表作者",
"Private playlist by": "私人播放列表",
"Public": "公开",
"Public playlist by": "公开播放列表",
"Quit": "退出",
"Random": "随机",
"Rating": "评分",
@@ -259,15 +259,15 @@
"Track gain": "曲目增益",
"Track number": "曲目编号",
"Track peak": "曲目峰值",
"Tracks": "Tracks",
"Tracks": "曲目",
"Transcode to": "转码为",
"UI Scaling": "UI 缩放",
"UI Scaling": "界面缩放",
"URL": "URL",
"Unable to play albums": "无法播放专辑",
"Unable to play artist radio": "无法播放艺术家电台",
"Unable to play random albums": "Unable to play random albums",
"Unable to play random albums": "无法播放随机专辑",
"Unable to play random tracks": "无法播放随机曲目",
"Unable to play song radio": "Unable to play song radio",
"Unable to play song radio": "无法播放电台歌曲",
"Unset favorite": "取消收藏",
"Use blurred album cover for Now Playing page background": "使用模糊的专辑封面作为“正在播放”页面背景",
"Use legacy authentication": "使用旧版认证",
+12 -12
View File
@@ -4,7 +4,7 @@
"Add Server": "添加服务器",
"Add to playlist": "添加到播放列表",
"Add to queue": "添加到队列",
"Advanced": "Advanced",
"Advanced": "高级",
"Album": "专辑",
"Album Count": "专辑数量",
"Album artist": "专辑艺术家",
@@ -57,7 +57,7 @@
"Compilation": "合集",
"Compilations": "合集",
"Composer": "作曲家",
"Composers": "Composers",
"Composers": "作曲家",
"Configure your music server to add radio stations": "配置您的音乐服务器以添加电台",
"Confirm Delete Playlist": "确认删除播放列表",
"Confirm Delete Server": "确认删除服务器",
@@ -92,9 +92,9 @@
"Equalizer": "均衡器",
"Error": "错误",
"Error creating playlist": "创建播放列表时出错",
"Error updating playlist": "Error updating playlist",
"Error updating playlist": "更新播放列表时出错",
"Exclusive mode": "独占模式",
"Fade out on pause": "Fade out on pause",
"Fade out on pause": "暂停时淡出",
"Fav.": "收藏",
"Favorites": "收藏",
"Feb": "二月",
@@ -133,7 +133,7 @@
"Lyrics": "歌词",
"Lyrics not available": "歌词不可用",
"Mar": "三月",
"Maximum image cache size": "Maximum image cache size",
"Maximum image cache size": "最大图像缓存大小",
"May": "五月",
"Menu": "菜单",
"Mixtape": "混音带",
@@ -177,9 +177,9 @@
"Prevent clipping": "防止削波",
"Prevent screensaver on Now Playing page": "禁止在“正在播放”页面显示屏幕保护程序",
"Previous": "上一个",
"Private playlist by": "私人 播放列表作者",
"Public": "Public",
"Public playlist by": "公开 播放列表作者",
"Private playlist by": "私人播放列表",
"Public": "公开",
"Public playlist by": "公开播放列表",
"Quit": "退出",
"Random": "随机",
"Rating": "评分",
@@ -259,15 +259,15 @@
"Track gain": "曲目增益",
"Track number": "曲目编号",
"Track peak": "曲目峰值",
"Tracks": "Tracks",
"Tracks": "曲目",
"Transcode to": "转码为",
"UI Scaling": "UI 缩放",
"UI Scaling": "界面缩放",
"URL": "URL",
"Unable to play albums": "无法播放专辑",
"Unable to play artist radio": "无法播放艺术家电台",
"Unable to play random albums": "Unable to play random albums",
"Unable to play random albums": "无法播放随机专辑",
"Unable to play random tracks": "无法播放随机曲目",
"Unable to play song radio": "Unable to play song radio",
"Unable to play song radio": "无法播放电台歌曲",
"Unset favorite": "取消收藏",
"Use blurred album cover for Now Playing page background": "使用模糊的专辑封面作为“正在播放”页面背景",
"Use legacy authentication": "使用旧版认证",
+7 -2
View File
@@ -43,6 +43,7 @@ type NowPlayingPage struct {
curLyrics *mediaprovider.Lyrics
curLyricsID string // id of track currently shown in lyrics
curRelatedID string // id of track currrently used to populate related list
curCoverArt string // id of cover art currently shown in background / card
totalTime float64
lastPlayPos float64
queue []mediaprovider.MediaItem
@@ -307,8 +308,12 @@ func (a *NowPlayingPage) OnSongChange(song mediaprovider.MediaItem, lastScrobble
a.card.Update(song)
if song == nil {
a.card.SetCoverImage(nil)
} else {
a.imageLoadCancel = a.im.GetFullSizeCoverArtAsync(song.Metadata().CoverArtID, a.onImageLoaded)
a.curCoverArt = ""
} else if artID := song.Metadata().CoverArtID; artID != a.curCoverArt {
a.imageLoadCancel = a.im.GetFullSizeCoverArtAsync(song.Metadata().CoverArtID, func(img image.Image, err error) {
a.curCoverArt = artID
a.onImageLoaded(img, err)
})
}
if a.tabs != nil && a.tabs.SelectedIndex() == 1 /*lyrics*/ {
+18 -1
View File
@@ -239,6 +239,7 @@ type tracklistRowBase struct {
// must be injected by extending widget
setColVisibility func(int, bool) bool
layout func(fyne.Size)
}
type TracklistRow interface {
@@ -297,6 +298,9 @@ func NewExpandedTracklistRow(tracklist *Tracklist, im *backend.ImageManager, pla
c.Hidden = vis
return c.Hidden != wasHidden
}
t.layout = func(s fyne.Size) {
container.Layout.Layout(container.Objects, s)
}
return t
}
@@ -316,8 +320,9 @@ func NewCompactTracklistRow(tracklist *Tracklist, playingIcon fyne.CanvasObject)
t.tracklistRowBase.create(tracklist)
t.playingIcon = playingIcon
t.Content = container.New(tracklist.colLayout,
container := container.New(tracklist.colLayout,
t.num, t.name, t.artist, t.album, t.albumArtist, t.composer, t.genre, t.dur, t.year, t.favorite, t.rating, t.plays, t.lastPlayed, t.comment, t.bpm, t.bitrate, t.size, t.fileType, t.dateAdded, t.path)
t.Content = container
colHiddenPtrMap := map[int]*bool{
2: &t.artist.Hidden,
@@ -348,6 +353,9 @@ func NewCompactTracklistRow(tracklist *Tracklist, playingIcon fyne.CanvasObject)
*ptr = vis
return vis != wasHidden
}
t.layout = func(s fyne.Size) {
container.Layout.Layout(container.Objects, s)
}
return t
}
@@ -409,11 +417,20 @@ func (t *tracklistRowBase) TrackID() string {
return t.trackID
}
func (t *tracklistRowBase) MinSize() fyne.Size {
// because tracklist rows have variable column visibility,
// we return a zero width here so that the tracklist
// can size based on the header instead.
s := t.BaseWidget.MinSize()
return fyne.NewSize(0, s.Height)
}
func (t *tracklistRowBase) Update(tm *util.TrackListModel, rowNum int, onUpdate func()) {
// Show only columns configured to be visible
for i := 2; i < len(t.tracklist.columns); i++ {
t.setColVisibility(i, !t.tracklist.visibleColumns[i])
}
t.layout(t.Size())
// Ealy return if nothing else needs updating
if !t.needsUpdate(tm, rowNum) {
+1 -1
View File
@@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Supersonic"
#define MyAppVersion "0.20.0"
#define MyAppVersion "0.20.1"
#define MyAppPublisher "Drew Weymouth"
#define MyAppURL "https://github.com/dweymouth/supersonic"
#define MyAppExeName "Supersonic.exe"