https://github.com/bernmic/go2music
https://github.com/bernmic/go2music
angular angularmaterial docker
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/bernmic/go2music
- Owner: bernmic
- License: mit
- Created: 2018-08-05T09:00:46.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2025-07-20T09:57:02.000Z (5 months ago)
- Last Synced: 2025-07-20T11:28:03.888Z (5 months ago)
- Topics: angular, angularmaterial, docker
- Language: Go
- Size: 36.7 MB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Go2Music
Simple project for first Go experiences.
It is a REST service with a database as backend. At this point, it can scan filesystem after MP3 files, read the metadata (id3v2) and store the data normalized in the database. After that it can deliver songs, albums and artists via REST calls.
It can also stream existing songs via http and serve existing covers.
For better organization, it supports playlists. There are manually created playlists and dynamic playlists which collects songs with a query. Simple Golang expressions (eg. album=="True") are supported.
There is a Dockerfile to create the smallest possible docker image and a docker-compose.yml to setup the complete app with a MySQL database.
## build
Clone this repository go to the cloned sources and run:
go get ./...
go build .
This will build the go2music executable.
## run
The executable can be started without any parameters. It tries to read the go2music.yaml where all configuration can be done. It supports also some environment variables:
| Environment variable | Description |
|--------------------------|---------------------------------------------------|
| GO2MUSIC_MEDIAPATH | Path to the media library |
| GO2MUSIC_DBUSERNAME | database user (default go2music) |
| GO2MUSIC_DBPASSWORD | database password (default go2music) |
| GO2MUSIC_DBSCHEMA | database schema (default go2music) |
| GO2MUSIC_DBURL | URL to the database |
| GO2MUSIC_DBTYPE | Type of database (mysql or postgres) |
| GO2MUSIC_BULK_INSERT | use bulk inserts to database (true or false) |
| GO2MUSIC_METRICS_COLLECT | collect metric for Prometheus (true or false) |
| GO2MUSIC_TAGGINGPATH | path to files to be tagged |
| GO2MUSIC_TOKENSECRET | secret for encrypting JWT |
| GO2MUSIC_CORS | add CORS middleware (all or direct) |
| GO2MUSIC_CONFIG | path to the go2music.yaml config file (default .) |
They do the same than the parameters in de go2music.yaml
## Database
Supported databases are
* MySQL 8.0+ for full support)
* MariaDB
* PostgreSQL
* CockroachDB
MariaDB and MySQL are fully tested. The other not. There is a db-create.sql in database-scripts which create the database and user for a MySQL or MariaDB and PostgreSQL.
MariaDB can be used with database type 'mysql'.
## Docker
The Dockerfile works in two steps. The first step will build the executable, the second step creates the image from scratch.
The docker-compose.yml can build the go2music image and creates the container for MySQL and go2music and links them together.
## Frontend
There is a complete web frontend for go2music in the frontend folder. It is a single page application written in typescript with Angular and Angular Material. You can build this in the frontend folder.
```
ng build -c production
```
This will build the frontend and copy the result to assets/front folder.
## Dynamic playlists
Dynamic playlists have an expression which will be converted into a SQL where clause.
Strings have to be in double quotes. Numbers are not quoted. Parenthesis are supported. Wildcards can be used in strings. '*' means zero or more character. '?' means exact one character.
### Fields in queries
| field | description | type |
|----------|--------------------------------|--------|
| album | title of the album | string |
| artist | name of the artist | string |
| song | title of the song | string |
| genre | genre of the song | string |
| duration | duration of the song (seconds) | number |
| year | year the song was published | string |
| rating | rating of the song (0-255) | number |
| track | track number on album | number |
| path | path where the song is stored | string |
| bitrate | bitrate of the song | number |
| samplerate | samplerate of the song | number |
### Logical operators
| operator | description |
|----------|-----------------|
| == | equal |
| != | not equal |
| >= | equal or higher |
| <= | equal or lower |
| \> | higher |
| < | lower |
| \|\| | logical OR |
| && | logical AND |
### Examples
- artist=="ABBA"
- artist=="Edguy" || artist=="Avantasia"
- album=="Bravo\*Hits\*"
- artist=="Nightwish" && year>="2013"
## Next steps
- bind artists, albums, songs to a musicbrainz id
- bring playcount and rating to the frontend
- Rewrite authentication and authorization.
- reduce dependencies in go.mod
- rewrite frontend with latest Angular and put it in a separate repo
- ~~Bulk-Insert~~
- SQlite support (https://pkg.go.dev/modernc.org/sqlite)
[Jetbrains](https://www.jetbrains.com/?from=go2music) supports this project with GoLand/IntelliJ Idea licenses. We appreciate their support for free and open source software!