|
|
|
|
@@ -13,30 +13,29 @@
|
|
|
|
|
|
|
|
|
|
## features
|
|
|
|
|
|
|
|
|
|
- browsing by folder (keeping your full tree intact) [see here](#directory-structure)
|
|
|
|
|
- browsing by tags (using [taglib](https://taglib.org/) - supports mp3, opus, flac, ape, m4a, wav, etc.)
|
|
|
|
|
- on-the-fly audio transcoding and caching (requires [ffmpeg](https://ffmpeg.org/)) (thank you [spijet](https://github.com/spijet/))
|
|
|
|
|
- jukebox mode (thank you [lxea](https://github.com/lxea/))
|
|
|
|
|
- browsing by folder (keeping your full tree intact) [see here](#directory-structure)
|
|
|
|
|
- browsing by tags (using [taglib](https://taglib.org/) - supports mp3, opus, flac, ape, m4a, wav, etc.)
|
|
|
|
|
- on-the-fly audio transcoding and caching (requires [ffmpeg](https://ffmpeg.org/)) (thank you [spijet](https://github.com/spijet/))
|
|
|
|
|
- jukebox mode (thank you [lxea](https://github.com/lxea/))
|
|
|
|
|
- support for podcasts (thank you [lxea](https://github.com/lxea/))
|
|
|
|
|
- pretty fast scanning (with my library of ~27k tracks, initial scan takes about 10m, and about 5s after incrementally)
|
|
|
|
|
- multiple users, each with their own transcoding preferences, playlists, top tracks, top artists, etc.
|
|
|
|
|
- [last.fm](https://www.last.fm/) scrobbling
|
|
|
|
|
- pretty fast scanning (with my library of ~27k tracks, initial scan takes about 10m, and about 5s after incrementally)
|
|
|
|
|
- multiple users, each with their own transcoding preferences, playlists, top tracks, top artists, etc.
|
|
|
|
|
- [last.fm](https://www.last.fm/) scrobbling
|
|
|
|
|
- [listenbrainz](https://listenbrainz.org/) scrobbling (thank you [spezifisch](https://github.com/spezifisch), [lxea](https://github.com/lxea))
|
|
|
|
|
- artist similarities and biographies from the last.fm api
|
|
|
|
|
- multiple genre support (see `GONIC_GENRE_SPLIT` to split tag strings on a character, eg. `;`, and browse them individually)
|
|
|
|
|
- a web interface for configuration (set up last.fm, manage users, start scans, etc.)
|
|
|
|
|
- support for the [album-artist](https://mkoby.com/2007/02/18/artist-versus-album-artist/) tag, to not clutter your artist list with compilation album appearances
|
|
|
|
|
- written in [go](https://golang.org/), so lightweight and suitable for a raspberry pi, etc. (see ARM images below)
|
|
|
|
|
- newer salt and token auth
|
|
|
|
|
- tested on [symfonium](https://symfonium.app), [dsub](https://f-droid.org/en/packages/github.daneren2005.dsub/), [jamstash](http://jamstash.com/), [sublime music](https://gitlab.com/sublime-music/sublime-music/), [soundwaves](https://apps.apple.com/us/app/soundwaves/id736139596), and [stmp](https://github.com/wildeyedskies/stmp)
|
|
|
|
|
|
|
|
|
|
- artist similarities and biographies from the last.fm api
|
|
|
|
|
- multiple genre support (see `GONIC_GENRE_SPLIT` to split tag strings on a character, eg. `;`, and browse them individually)
|
|
|
|
|
- a web interface for configuration (set up last.fm, manage users, start scans, etc.)
|
|
|
|
|
- support for the [album-artist](https://mkoby.com/2007/02/18/artist-versus-album-artist/) tag, to not clutter your artist list with compilation album appearances
|
|
|
|
|
- written in [go](https://golang.org/), so lightweight and suitable for a raspberry pi, etc. (see ARM images below)
|
|
|
|
|
- newer salt and token auth
|
|
|
|
|
- tested on [symfonium](https://symfonium.app), [dsub](https://f-droid.org/en/packages/github.daneren2005.dsub/), [jamstash](http://jamstash.com/), [sublime music](https://gitlab.com/sublime-music/sublime-music/), [soundwaves](https://apps.apple.com/us/app/soundwaves/id736139596), and [stmp](https://github.com/wildeyedskies/stmp)
|
|
|
|
|
|
|
|
|
|
## installation
|
|
|
|
|
|
|
|
|
|
the default login is **admin**/**admin**.
|
|
|
|
|
password can then be changed from the web interface
|
|
|
|
|
|
|
|
|
|
### ...from source
|
|
|
|
|
### ...from source
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
$ apt install build-essential git sqlite libtag1-dev ffmpeg libasound-dev # for debian like
|
|
|
|
|
@@ -47,13 +46,14 @@ $ gonic -h # or see "configuration options below"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**note:** unfortunately if you do this above, you'll be compiling gonic locally on your machine
|
|
|
|
|
(if someone knows how I can statically link sqlite3 and taglib, please let me know so I can distribute static binaries)
|
|
|
|
|
(if someone knows how I can statically link sqlite3 and taglib, please let me know so I can distribute static binaries)
|
|
|
|
|
|
|
|
|
|
### ...with docker
|
|
|
|
|
### ...with docker
|
|
|
|
|
|
|
|
|
|
the image is available on dockerhub as [sentriz/gonic](https://hub.docker.com/r/sentriz/gonic)
|
|
|
|
|
the image is available on dockerhub as [sentriz/gonic](https://hub.docker.com/r/sentriz/gonic)
|
|
|
|
|
|
|
|
|
|
available architectures are
|
|
|
|
|
|
|
|
|
|
- `linux/amd64`
|
|
|
|
|
- `linux/arm/v6`
|
|
|
|
|
- `linux/arm/v7`
|
|
|
|
|
@@ -62,31 +62,31 @@ available architectures are
|
|
|
|
|
```yaml
|
|
|
|
|
# example docker-compose.yml
|
|
|
|
|
|
|
|
|
|
version: '2.4'
|
|
|
|
|
version: "2.4"
|
|
|
|
|
services:
|
|
|
|
|
gonic:
|
|
|
|
|
image: sentriz/gonic:latest
|
|
|
|
|
environment:
|
|
|
|
|
- TZ
|
|
|
|
|
- TZ
|
|
|
|
|
# optionally, see more env vars below
|
|
|
|
|
expose:
|
|
|
|
|
- 80
|
|
|
|
|
- 80
|
|
|
|
|
volumes:
|
|
|
|
|
- ./data:/data # gonic db etc
|
|
|
|
|
- /path/to/music:/music:ro # your music
|
|
|
|
|
- /path/to/podcasts:/podcasts # your podcasts
|
|
|
|
|
- /path/to/cache:/cache # transcode / covers / etc cache dir
|
|
|
|
|
- ./data:/data # gonic db etc
|
|
|
|
|
- /path/to/music:/music:ro # your music
|
|
|
|
|
- /path/to/podcasts:/podcasts # your podcasts
|
|
|
|
|
- /path/to/cache:/cache # transcode / covers / etc cache dir
|
|
|
|
|
|
|
|
|
|
# set the following two sections if you've enabled jukebox
|
|
|
|
|
group_add:
|
|
|
|
|
- audio
|
|
|
|
|
- audio
|
|
|
|
|
devices:
|
|
|
|
|
- /dev/snd:/dev/snd
|
|
|
|
|
- /dev/snd:/dev/snd
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
then start with `docker-compose up -d`
|
|
|
|
|
|
|
|
|
|
### ...with systemd
|
|
|
|
|
### ...with systemd
|
|
|
|
|
|
|
|
|
|
tested on Ubuntu 21.04
|
|
|
|
|
|
|
|
|
|
@@ -141,58 +141,62 @@ $ journalctl --follow --unit gonic # check logs
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
should be installed and running on boot now 👍
|
|
|
|
|
view the admin UI at http://localhost:4747
|
|
|
|
|
view the admin UI at <http://localhost:4747>
|
|
|
|
|
|
|
|
|
|
### ...elsewhere
|
|
|
|
|
### ...elsewhere
|
|
|
|
|
|
|
|
|
|
[](https://repology.org/project/gonic/versions)
|
|
|
|
|
|
|
|
|
|
## configuration options
|
|
|
|
|
|
|
|
|
|
| env var | command line arg | description |
|
|
|
|
|
| ----------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
| `GONIC_MUSIC_PATH` | `-music-path` | path to your music collection (see also multi-folder support below) |
|
|
|
|
|
| `GONIC_PODCAST_PATH` | `-podcast-path` | path to a podcasts directory |
|
|
|
|
|
| `GONIC_CACHE_PATH` | `-cache-path` | path to store audio transcodes, covers, etc |
|
|
|
|
|
| `GONIC_DB_PATH` | `-db-path` | **optional** path to database file |
|
|
|
|
|
| `GONIC_HTTP_LOG` | `-http-log` | **optional** http request logging, enabled by default |
|
|
|
|
|
| `GONIC_LISTEN_ADDR` | `-listen-addr` | **optional** host and port to listen on (eg. `0.0.0.0:4747`, `127.0.0.1:4747`) (_default_ `0.0.0.0:4747`) |
|
|
|
|
|
| `GONIC_TLS_CERT` | `-tls-cert` | **optional** path to a TLS cert (enables HTTPS listening) |
|
|
|
|
|
| `GONIC_TLS_KEY` | `-tls-key` | **optional** path to a TLS key (enables HTTPS listening) |
|
|
|
|
|
| `GONIC_PROXY_PREFIX` | `-proxy-prefix` | **optional** url path prefix to use if behind reverse proxy. eg `/gonic` (see example configs below) |
|
|
|
|
|
| `GONIC_SCAN_INTERVAL` | `-scan-interval` | **optional** interval (in minutes) to check for new music (automatic scanning disabled if omitted) |
|
|
|
|
|
| `GONIC_SCAN_WATCHER ` | `-scan-watcher-enabled` | **optional** whether to watch file system for new music and rescan |
|
|
|
|
|
| `GONIC_JUKEBOX_ENABLED` | `-jukebox-enabled` | **optional** whether the subsonic [jukebox api](https://airsonic.github.io/docs/jukebox/) should be enabled |
|
|
|
|
|
| `GONIC_GENRE_SPLIT` | `-genre-split` | **optional** a string or character to split genre tags on for multi-genre support (eg. `;`) |
|
|
|
|
|
| env var | command line arg | description |
|
|
|
|
|
| ------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
| `GONIC_MUSIC_PATH` | `-music-path` | path to your music collection (see also multi-folder support below) |
|
|
|
|
|
| `GONIC_PODCAST_PATH` | `-podcast-path` | path to a podcasts directory |
|
|
|
|
|
| `GONIC_CACHE_PATH` | `-cache-path` | path to store audio transcodes, covers, etc |
|
|
|
|
|
| `GONIC_DB_PATH` | `-db-path` | **optional** path to database file |
|
|
|
|
|
| `GONIC_HTTP_LOG` | `-http-log` | **optional** http request logging, enabled by default |
|
|
|
|
|
| `GONIC_LISTEN_ADDR` | `-listen-addr` | **optional** host and port to listen on (eg. `0.0.0.0:4747`, `127.0.0.1:4747`) (_default_ `0.0.0.0:4747`) |
|
|
|
|
|
| `GONIC_TLS_CERT` | `-tls-cert` | **optional** path to a TLS cert (enables HTTPS listening) |
|
|
|
|
|
| `GONIC_TLS_KEY` | `-tls-key` | **optional** path to a TLS key (enables HTTPS listening) |
|
|
|
|
|
| `GONIC_PROXY_PREFIX` | `-proxy-prefix` | **optional** url path prefix to use if behind reverse proxy. eg `/gonic` (see example configs below) |
|
|
|
|
|
| `GONIC_SCAN_INTERVAL` | `-scan-interval` | **optional** interval (in minutes) to check for new music (automatic scanning disabled if omitted) |
|
|
|
|
|
| `GONIC_SCAN_WATCHER` | `-scan-watcher-enabled` | **optional** whether to watch file system for new music and rescan |
|
|
|
|
|
| `GONIC_JUKEBOX_ENABLED` | `-jukebox-enabled` | **optional** whether the subsonic [jukebox api](https://airsonic.github.io/docs/jukebox/) should be enabled |
|
|
|
|
|
| `GONIC_PODCAST_PURGE_AGE` | `-podcast-purge-age` | **optional** age (in days) to purge podcast episodes if not accessed |
|
|
|
|
|
| `GONIC_GENRE_SPLIT` | `-genre-split` | **optional** a string or character to split genre tags on for multi-genre support (eg. `;`) |
|
|
|
|
|
|
|
|
|
|
## screenshots
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|:-:|:-:|:-:|:-:|:-:|
|
|
|
|
|
|||||
|
|
|
|
|
| | | | | |
|
|
|
|
|
| :-----------------------------------------------------------------------------: | :-----------------------------------------------------------------------------: | :-----------------------------------------------------------------------------: | :-----------------------------------------------------------------------------: | :-----------------------------------------------------------------------------: |
|
|
|
|
|
|  |  |  |  |  |
|
|
|
|
|
|
|
|
|
|
## multiple folders support (v0.15+)
|
|
|
|
|
|
|
|
|
|
gonic supports multiple music folders. this can be handy if you have your music separated by albums, compilations, singles. or maybe 70s, 80s, 90s. whatever.
|
|
|
|
|
gonic supports multiple music folders. this can be handy if you have your music separated by albums, compilations, singles. or maybe 70s, 80s, 90s. whatever.
|
|
|
|
|
|
|
|
|
|
if you're running gonic with the command line, stack the `-music-path` arg
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ gonic -music-path /path/to/albums -music-path /path/to/compilations
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
if you're running gonic with ENV_VARS, or docker, try separate with a comma
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
GONIC_MUSIC_PATH=/path/to/albums,/path/to/compilations
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
if you're running gonic with the config file, you can repeat the `music-path` option
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
music-path /path/to/albums
|
|
|
|
|
music-path /path/to/compilations
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
after that, most subsonic clients should allow you to select which music folder to use.
|
|
|
|
|
queries like show me "recently played compilations" or "recently added albums" are possible for example.
|
|
|
|
|
after that, most subsonic clients should allow you to select which music folder to use.
|
|
|
|
|
queries like show me "recently played compilations" or "recently added albums" are possible for example.
|
|
|
|
|
|
|
|
|
|
## example nginx config with `GONIC_PROXY_PREFIX`
|
|
|
|
|
|
|
|
|
|
@@ -208,11 +212,12 @@ queries like show me "recently played compilations" or "recently added albums" a
|
|
|
|
|
|
|
|
|
|
## directory structure
|
|
|
|
|
|
|
|
|
|
when browsing by folder, any arbitrary and nested folder layout is supported, with the following caveats:
|
|
|
|
|
when browsing by folder, any arbitrary and nested folder layout is supported, with the following caveats:
|
|
|
|
|
|
|
|
|
|
- Files from the same album must all be in the same folder
|
|
|
|
|
- All files in a folder must be from the same album
|
|
|
|
|
|
|
|
|
|
please see [here](https://github.com/sentriz/gonic/issues/89) for more context
|
|
|
|
|
please see [here](https://github.com/sentriz/gonic/issues/89) for more context
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
music
|
|
|
|
|
|