Releases: sentriz/gonic
Releases · sentriz/gonic
Release list
gonic v0.22.0
gonic v0.21.0
Highlights
- Transcoding works out of the box.
streamnow honorsformatandmaxBitRatewithout 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)
timeOffsetandestimateContentLengthare 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.
displayArtistnow usesARTIST_CREDIT - 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...
gonic v0.20.1
gonic v0.20.0
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
.apeas 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
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