Skip to content

Releases: sentriz/gonic

gonic v0.22.0

Choose a tag to compare

@github-actions github-actions released this 08 Jun 19:47
5ae99e8

Features

  • gonic: resolve artist info from musicbrainz without a lastfm key (ff022c1)
  • gonic: store and deduplicate artists by musicbrainz id (ae546e6)

Bug Fixes

  • lastfm: ignore placeholder image when stealing artist image (e800661)
  • subsonic: only consult format prefs when client requests a format (1dd97a5)
  • subsonic: restrict startScan to admin users (2376c61)

gonic v0.21.0

Choose a tag to compare

@github-actions github-actions released this 25 May 18:44
a45ecce

Highlights

  • Transcoding works out of the box. stream now honors format and maxBitRate without needing a per-user profile, so clients like Symfonium can pick a bitrate per-network with zero server-side setup. Admins can also configure per-format defaults from a new admin UI section. For legacy clients like Sonus, use the existing but now renamed "per-client overrides" section
  • Seeking works in transcoded streams. Cached transcodes are served with proper HTTP Range support, so scrubbing through an opus transcode now behaves like scrubbing through a normal file. For cache misses (first time streaming) timeOffset and estimateContentLength are now supported
  • Track play counts are returned on individual tracks (#459), so scrobble counts sync correctly across devices
  • Richer artist metadata: track contributors, performer roles, and per-relationship credit names are scanned and exposed. displayArtist now uses ARTIST_CREDIT
    • See Richer artist metadata demo below
    • Recommended taggers for full support beets or wrtag
  • More scanned tags: ISRCs, record labels, and per-track year tags are now picked up and returned to clients that support them
  • Portable m3u playlists use relative paths, so they survive moves between machines or library roots (#537, #529)
  • Bounded cover art cache with configurable size and eviction interval, useful on smaller disks (#687)
  • Security: playlist ownership is now enforced - one user can no longer fetch or delete another user's playlists

Upgrade notes

  • A full ("slow") scan is recommended after upgrading to v0.21.0 to pick up the newly scanned fields (contributors, ISRCs, record labels, per-track years, ARTIST_CREDIT)

⚠ BREAKING CHANGES

  • deps: bump to go1.26

Features

  • add cache size and eject interval for cover art cache (#687) (b25bf3c)
  • ci: update golangci-lint (be36fb4)
  • db: refactor artist and album level artist roles (1edd175)
  • db: update log format (3793d48)
  • docs: add Music Assistant to list of tested applications (#676) (f5eecae)
  • gonic: add genre-tree option to expand genre hierarchies (be4e137)
  • gonic: scan and return per-relationship credit names (731c07a)
  • gonic: use more efficient job polling (9b4a0e3)
  • lastfm: retry when artist image fetch fails (4eef4df)
  • playlist: use relative paths in m3u playlists (798e7f8), closes #537 #529
  • podcast: ensure that any error path out of doPodcastDownload sets status (#672) (192ee10)
  • scan and return track contributors (f9b6e27)
  • scanner: also read multi vorbis singular tags (896b0dd), closes #659
  • scanner: skip macOS resource fork files (e2dabd2), closes #657
  • subsonic: add configurable per format transcoding defaults (b0e2c94)
  • subsonic: don't render track contributors for DSub (3ae3177)
  • subsonic: honor stream format/maxBitRate without a configured profile (9d888c0)
  • subsonic: make error codes match Open Subsonic spec (#671) (1b770c9)
  • subsonic: return alternate performance name artists from getSimilarArtists (a7bbf55)
  • subsonic: return artist roles field (d5ef198)
  • subsonic: return band member name artists from getSimilarArtists (c2a11a2)
  • subsonic: return consistent shapes (72418cd)
  • subsonic: scan and return ISRCs to child data (#688) (52e0fa1)
  • subsonic: scan and return record labels (36fe025)
  • subsonic: serve cached transcodes directly for Range support (58a2d06)
  • subsonic: sort genres alphabetically by default (bf8469c)
  • subsonic: support estimateContentLength on stream (2953d23)
  • subsonic: support track level play counts (9f706b9), closes #459
  • subsonic: use ARTIST_CREDIT for displayArtist fields (44c2d79)
  • support track level year tags (#661) (5e916d0)

Bug Fixes

  • cmd: don't panic on context.Canceled during shutdown (03a9d06)
  • lastfm: don't replace cached artist image with empty on refresh (ec457fb)
  • listenbrainz: disable post-quantum TLS to avoid connection reset errors (b2674f8)
  • podcast: don't try to rm the podcast directory when deleting an episode (8a860dd)
  • podcast: fix crash if itunes extensions are missing (#668) (9473ec7)
  • scanner: reduce sqlite lock contention during scans (5daf95c), closes #678
  • scanner: reset batch timer on fsnotify Remove events (65c4674), closes #637
  • scanner: set track created_at from file birth/mod time (5a5308b), closes #693
  • subsonic: allow no podcast id for getPodcasts (737c7f1), closes #686
  • subsonic: always report scrobblingEnabled true (a2db490), closes #644
  • subsonic: contain playlist paths to prevent cross-user access (0824bed)
  • subsonic: enforce playlist ownership on getPlaylist/deletePlaylist (6dd71e6)
  • subsonic: provide uncompressed file on /download (#679) (3e436aa)
  • subsonic: return artist as track artist in TrackChild (9407450), closes #654
  • subsonic: return averageRating as float ([0f98064](https://www.gith...
Read more

gonic v0.20.1

Choose a tag to compare

@github-actions github-actions released this 30 Jan 10:00
c36580f

Bug Fixes

  • playlist: fix regression in playlist ID handling (103a048), closes #655

gonic v0.20.0

Choose a tag to compare

@github-actions github-actions released this 25 Jan 00:12
13255e6

Features

  • add support for playlist cover art on filesystem (aad729e), closes #650
  • ci: bump golangci-lint (79e3898)
  • db: add an index on albums.created_at (816e437), closes #620
  • gonic: add log-db option to log queries (75a0918), closes #620
  • scanner: read multi valued release types (c752a22)
  • subsonic: allow non admins to download podcast episodes (c2ebe96), closes #623
  • subsonic: implement getSimilarSongs for artists and albums (#649) (db9aa2b)
  • subsonic: return disc titles (0377bfa)
  • taglib: add .ape as a supported filetype (82642eb), closes #615

Bug Fixes

  • db: enable WAL also for Wasm driver (b67c1c1), closes #620
  • db: use separate DSN for both drivers (4696499)
  • gonic: correct typo in command line help (#640) (99e2ccf)
  • podcast: truncate filenames longer than 200 chars (e12ab54), closes #624
  • podcast: validate response status code when fetching podcast audio (2900ce5), closes #639
  • scanner: clear metadata of albums who no longer have tracks (ca59601), closes #638
  • scanner: reset embedded cover for album when toggling scan-embedded-cover (ea5e625), closes #619
  • subsonic: correct spec typos (04ff7f3), closes #653

gonic v0.19.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 15:19
b957f50

This release uses WebAssesmby for the tagging and database backends. This means that gonic no longer requires Cgo or external dependencies to build. As a result, static binaries will be available in the releases page, and Docker images for more architectures. Performance of scanning and tagging should also be improved.

Features

  • build: add Cgo free database (505f7d8)
  • build: add Cgo free tagging backend (7802e20)
  • ci: merge nightly and debug workflows (ca85eed)
  • ci: remove Cgo dependencies, cross compile without QEMU, upload static binaries (e3db819)
  • ffprobe: add more supported file types (8e7820a)
  • gonic: add scan-embedded-cover-enabled flag (c69cb8c)
  • gonic: use wrtag/normtag for nag normalisation (aba758f)
  • subsonic: also read unsynced lyrics from .txt files and tag metadata (eb0d8fd), closes #593
  • subsonic: keep original cover file format when caching (#609) (1af4ce3), closes #11
  • subsonic: return genres for getAlbumListTwo2 (3909e9b), closes #605
  • subsonic: support embedded cover art (ec7cffd), closes #11 #556
  • subsonic: support embedded track level cover art (d66814b), closes #11
  • tags: add ffprobe reader (3a9c03a)
  • tags: add Properties.HasCover (bc0b6c0)
  • tags: add ReadCover interface method (e413bc3)

⚠ Note to package maintainers

  • The sqlite-dev and libtag-dev (or your distro's equivalents) packages are no longer required; please remove them from package dependencies.
  • Build with CGO_ENABLED=0 to produce static binaries.

gonic now vendors reproducible WebAssembly backends for TagLib and SQLite, eliminating Cgo and external system libraries. Builds are fully static, cross-compiling is straightforward, and supply-chain verification is easier.

Verify the vendored WASM artifacts using Artifact Attestations:

Example build pipeline:

$ git clone https://github.com/sentriz/gonic
$ cd gonic

$ sha256sum "$(go list -m -f '{{.Dir}}' go.senan.xyz/taglib)/taglib.wasm"
# expected ca5ce04b35f1e6cad8b8d9f00906a4c108ccd004b56e713db5ce69aa69b3805d (https://github.com/sentriz/go-taglib/attestations/11402786)

$ sha256sum "$(go list -m -f '{{.Dir}}' github.com/ncruces/go-sqlite3)/embed/sqlite3.wasm"
# expected 117262b6241d8de78ba564a44383fa1562e52f1a978de269e20a02b3c06c02e3 (https://github.com/ncruces/go-sqlite3/attestations/11344814)

$ CGO_ENABLED=0 go build ./cmd/gonic/.

Opting out of WebAssembly:

  • If you prefer not to use the WebAssembly binaries, you can build with nowasm:
$ go build -tags nowasm ./cmd/gonic/.
  • This mode is not supported, and tagging/scan performance will degrade.
  • Cgo will be used for sqlite, so sqlite-dev is still required.
  • ffprobe will be used for tagging, so that must be available in $PATH. libtag-dev is still not used in this mode.

gonic v0.18.0

Choose a tag to compare

@github-actions github-actions released this 22 Sep 08:45
e8d03f4

⚠ BREAKING CHANGES

  • deps: bump to go1.25

Features

  • docker: use alpine native taglib (c9f4181)
  • readme: document comma escaping in readme (eaa82b0), closes #596
  • subsonic: add support for lyrics (#519) (db97bc7)
  • subsonic: better support for internet radio and podcast episodes in jukebox (3db183b), closes #572
  • subsonic: replace html2text with bluemonday (5916a7f), closes #591

Bug Fixes

  • subsonic: restore disc/track ordering in getMusicDirectory (8ac8779), closes #597

Miscellaneous Chores

gonic v0.17.0

Choose a tag to compare

@github-actions github-actions released this 21 Aug 22:55
72376a4

Features

  • db: add a covering index on tracks (album_id, length) (018343d), closes #508
  • lastfm: paginate loved tracks (5c7d065)
  • playlist: assume playlists in the root dir without a user dir belong to admin (#499) (f5893ea)
  • podcast: download most recent episode when switching to download recent mode (c222ecb), closes #557
  • podcast: use podcast author if episode author is not defined (#574) (19b707c)
  • scanner: cleanup bookmarks on scan (#583) (b8dfe14)
  • scanner: support full scan cleanups in watcher (#496) (93ce039)
  • scanner: use wrtag/coverparse for cover selection (453639e), closes #338 #516
  • subsonic: allow search albums with MBID (7b19101)
  • subsonic: allow search with MBID (#579) (2d4111d)
  • subsonic: bump image cache expiration (bbe16b7)
  • subsonic: expose album isCompilation and releaseTypes (29b7549)
  • subsonic: expose replaygain tags (0e45f5e)
  • subsonic: fallback to filename when title is missing tags (58d54c2), closes #541
  • subsonic: support more podcast metadata and podcast bookmarks (#569) (63a420d)
  • transcode: add cache pruning and config options (bcb613c)

Bug Fixes

  • admin: better handing of resolve proxy path escaping (7b21e82), closes #493
  • adminui: resolve reverse proxy paths for fonts (718686a), closes #543
  • ci: bump golangci-lint (640d872)
  • ci: ignore gosec integer overflow conversion (120fd79)
  • ci: update .golangci.yml exclude config (e5f7ef3)
  • ci: use new sqlite package name (1c23771)
  • dockerfile: install abuild key (#526) (fb36dbf)
  • playlist: fix non-admin users not being able to create playlists (#524) (ac798ac)
  • podcast: gracefully handle no podcast cover URL (#547) (aef5f92)
  • subsonic: gracefully handle missing playqueue items (3fc9d5d)
  • subsonic: order some browse-by-tag responses (39df00e), closes #512
  • subsonic: populate ArtistID and AlbumID for playlists (#567) (c6d8751)
  • subsonic: skip bookmarks for missing items instead of failing (#580) (e3dc188)
  • taglib: support lower case filenames again (8a0fa05), closes #491

gonic v0.16.4

Choose a tag to compare

@github-actions github-actions released this 20 Mar 21:21
02189bb

Features

  • support internet radio stations for jukebox (62d49a3), closes #481

Bug Fixes

  • subsonic: allow unlimited bitrate with no transcode setting configured (81f8a7e), closes #485

gonic v0.16.3

Choose a tag to compare

@github-actions github-actions released this 09 Mar 19:31
6b8d6b7

Features

  • bump audiotags fork to support taglib v2 (29c5397)
  • lastfm: autocorrect artist and album name misspellings when fetching info (2878b88), closes #472
  • lastfm: strip copyright text from albumInfo/artistInfo responses (aa82b94)
  • listenbrainz: submit release MBID (#443) (552aa3a)
  • replace ff with with flagconf (3ada74c)
  • subsonic: expose track musicbrainz id (f98b232)
  • subsonic: prefer tagged musicbrainz ID over lastfm in getAlbumInfo (422c684), closes #444
  • subsonic: return changed field in playlist response (8b4fc04), closes #455
  • subsonic: return playCount in album responses (ec55f3b), closes #458
  • subsonic: return an error if maxBitRate requested with no user transcode preferences set (88e58c0)
  • subsonic: return http form post opensubsonic extension key (e8ae1c1)
  • upgrade to ff v4 (4600ee1), closes #473

Bug Fixes

  • ci: manually add taglib v2 APKBUILD (51fa0ba)
  • db: add double index for right side of unique compound indexes (d640a9f), closes #426
  • docker: fix sqlite3 musl build (433829d)
  • listenbrainz: set track length submission and include submission client details (#424) (b27c02f)
  • playlist: return new playlist id for createPlaylist (314e963), closes #464
  • podcast: collect all episode errors when adding new podcast (2f109f1), closes #430
  • podcast: slightly more robust downloading and concurrency (#433) (f34cd2e)
  • scanner: clean up orphaned album genres when dir still exists without tracks (19ebd45), closes #466
  • scanner: gracefully handle multi value tag delim splits with adjacent delimiters (eb79cec), closes #448
  • specid: match music dirs with trailing slash (#439) (e63ee96)
  • subsonic: always return playlist duration (87943ea), closes #457
  • subsonic: fix getAvatar user request comparison (#469) (2949b4c)
  • subsonic: return error code 70 for not found errors in more places (42dbfa7), closes #454

gonic v0.16.2

Choose a tag to compare

@github-actions github-actions released this 30 Nov 22:31

Features

  • set global http timeouts except for streaming endpoints (2edb1b8), closes #411

Bug Fixes

  • admin: don't start with empty session key (dd0f6b3), closes #414
  • jukebox: make sure we clean up "seekable" event listener (b199bc1), closes #411
  • jukebox: restore play index only when incoming new track has index >0 (82c3c5b), closes #411
  • subsonic: return empty opensubsonic fields (5022500)