Releases: sentriz/gonic
gonic v0.19.0
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-enabledflag (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-devandlibtag-dev(or your distro's equivalents) packages are no longer required; please remove them from package dependencies. - Build with
CGO_ENABLED=0to 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:
- https://github.com/sentriz/go-taglib/raw/refs/tags/v0.10.4/taglib.wasm (Attestations)
- https://github.com/ncruces/go-sqlite3/raw/refs/tags/v0.29.1/embed/sqlite3.wasm (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.
ffprobewill be used for tagging, so that must be available in$PATH.libtag-devis still not used in this mode.
gonic v0.18.0
⚠ 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
Miscellaneous Chores
gonic v0.17.0
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
isCompilationandreleaseTypes(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
gonic v0.16.3
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
changedfield in playlist response (8b4fc04), closes #455 - subsonic: return
playCountin 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
Features
Bug Fixes
gonic v0.16.1
Features
- add more and unify stats (2fdc1f4)
- store and expose individual track artists (c1a34dc)
- subsonic: add getAlbumInfo with cache (cc1a99f)
- subsonic: expose all of album "name"/"title"/"album" for browse by tag and browse by folder (2df9052), closes #404
- subsonic: expose track/album displayArtist/displayAlbumArtist (0718aab), closes #406
- subsonic: support getAlbumList/getAlbumList2
type=highest(a30ee3d), closes #404
Bug Fixes
- add track count to /debug/vars metrics endpoint (69c02e8), closes #392
- contrib: update config example (d03d2dc)
- don't panic when scan on start fails (37e826e), closes #399
- metrics: have a distinction between folders and albums (cae3725), closes #396
- scanner: make sure we roll back invalid parents (ddb686b), closes #402
- store and scrobble with real album artist info string (fe0567a)
- subsonic: don't return concatenated genres strings for song/trackchilds (f18151b)
- subsonic: songCount and albumCount in genre objects is required (#390) (b17e76e)
- use conf cache-path instead of XDG_CACHE_HOME for jukebox socket (9818523), closes #391
gonic v0.16.0
Highlights
-
support for multi valued tags such as
albumartistsandgenresfound in audio metadata- this means a cleaner artist list, and the ability to find the same album by multiple artists in their respective artist pages
- since there is no longer a direct relationship between guessed "artist dir" and album dir, a side effect of this change is that support for local artist covers on the filesystem has been dropped. however, last.fm artist images are working now
- use a nice client like airsonic-refix for a nice experience when clicking artist names too

- see the readme for more details
-
much improved last.fm artist covers and info situation
- full artist covers from last.fm are fetched and rendered
- artist bio responses from last.fm are cached so visiting artist pages should be much snappier
-
playlists (including tracks and podcast episodes) are now backed by m3u files instead of the gonic database
- this means having gonic playlists can be parsed and generated by external tools, we get import and export for free, and solves an issue of playlist entry pointers having ephemeral ids during rescans
- (you will need to add a new playlist directory when starting gonic, the old database entries will be migrated)
-
closer integration and collaboration with the @opensubsonic project
-
a new experimental tool gonic-lastfm-sync for bidirectional sync of lastfm and gonic data
-
many more features and fixes. see the granular changelog below
⚠ BREAKING CHANGES
- build: bump to go 1.21
- subsonic: drop support for guessed artist covers in filesystem
playlists-pathoption now required to start
Features
- add .wav to list of supported audio types (#322) (ab07b87)
- add option for /debug/vars endpoint to expose database and media stats (2a7a455), closes #372 #150
- add support for wavpack (#380) (827baf2)
- admin: sort transcode profile names (ae5bc2e), closes #288
- admin: support application/x-mpegurl playlist uploads (6aa4c42), closes #282
- admin: update stylesheet (222256c)
- allow multi valued tag modes to be configurable (8f6610f)
- ci: add a bunch more linters (e3dd812)
- ci: update checkout and setup-go actions (#326) (6144ac7)
- ci: update golangci-lint and action (#325) (85eeb86)
- contrib: improve system related contrib files (ac74b35)
- enable profile-guided optimization (e842b89)
- lastfm: add user get loved tracks method (9026c9e)
- podcast: parse podcast episode descriptions from HTML to plain text (#351) (7d2c4fb)
- scanner: add a new option for excluding paths based on a regexp (1d38776)
- scanner: support more cover types (906164a)
- scanner: support non lowercase extensions like .Mp3 (d83fe56)
- store and use m3u files on filesystem for playlists (7dc9575), closes #306 #307 #66
- subsonic: add getOpenSubsonicExtensions endpoint and openSubsonic response key (2caee44)
- subsonic: add support for multi-valued album artist tags (3ac7782)
- subsonic: add support for podcast episodes in both playlists and play queues (aecee3d)
- subsonic: cache and use lastfm responses for covers, bios, top songs (c374577)
- subsonic: change frequent album list to use total time played per album instead of play count. (#331) (7982ffc)
- subsonic: drop support for guessed artist covers in filesystem (657fb22)
- subsonic: expose all album genres in a list of subsonic api (749233d)
- subsonic: fetch artist images from lastfm opengraph (4757495), closes #295
- subsonic: gracefully handle missing podcast episode paths when returning playlists (d5f8e23)
- subsonic: improve search2 and search3 when there are multiple words searched on. (#335) (cbab68b)
- subsonic: make it easier to add more tag reading backends (8382f61)
- subsonic: order results from getStarred reverse chronologically based on star date (b3c863c)
- subsonic: return artist cover ids for similar artists response (c15349f)
- subsonic: scrobble to different scrobble backends in parallel (1ea2402)
- subsonic: support timeOffset in stream.view (#384) (7eaf602)
- subsonic: update track play stats on scrobble instead of stream (e0b1603)
- sunsonic: expose type serverVersion in subsonic responses (b8fceae)
- tags: support multi valued tags like albumartists (623d5c3)
- transcode: add MP3 320 transcoding profile (#363) (a644f0f)
- transcode: add opus 192 profile (5dcc8c1)
- transcode: lock the destination transcode cache path (c9a2d2f)
Bug Fixes
- admin: continue on track match error (16e6046)
- podcasts: make sure we use safeFilename for podcast episodes too (#339) (5fb9c49)
- podcasts: remove query parameters from URL when getting the extension (19be6f0)
- scanner: fix watcher panic (78d0c52)
- scanner: remove redundant mod time look up (e0a8c18), closes [#293](https://www.github.com/sentriz/gonic/issues/293...
gonic v0.16.0 rc1
gonic v0.16.0 release candidate 1
👉 if you want to help with the release of v0.16.0 please upgrade, test, and report issues. thanks!
👉 full v0.16.0 changelog is here
outstanding for full release
👉 fixes from your testing
👉 postgres support
installation
👉 docker dockerhub docker pull sentriz/gonic:v0.16.0-rc1
👉 docker ghcr docker pull ghcr.io/sentriz/gonic:v0.16.0-rc1
👉 source go install go.senan.xyz/cmd/[email protected]
gonic v0.15.2
Bug Fixes
- subsonic: send valid content-type with http.ServeStream (8dc58c7)