Music Server built on the Open Subsonic API, designed to showcase AudioMuse-AI's advanced sonic analysis capabilities.
The full list or AudioMuse-AI related repository are:
- AudioMuse-AI: the core application, it run Flask and Worker containers to actually run all the feature;
- AudioMuse-AI Helm Chart: helm chart for easy installation on Kubernetes;
- AudioMuse-AI Plugin for Jellyfin: Jellyfin Plugin;
- AudioMuse-AI MusicServer: Open Subosnic like Music Sever with integrated sonic functionality.
Pre-built Docker containers are available!
You can run AudioMuse-AI-MusicServer using our automatically built and published Docker containers from GitHub Container Registry. This is the easiest way to get started without needing to compile anything.
docker pull ghcr.io/neptunehub/audiomuse-ai-musicserver:latestFor detailed container usage instructions, deployment options, and release information, see: CONTAINER_RELEASE.md
The containers include both the backend API server and frontend web interface, with automatic nightly builds and easy version management.
After deploying AudioMsue-AI-Music server it could be reached BOTH from this url:
The first login can be done with:
- User: admin
- password: admin
The configuration needed is go in the admin tab and:
- add the path of the song, and start the scanning, depending from the size of the library could takes several minutes. This is just to add the song to the mediaserver
- configure the path of
AudioMuse-AI(the core contianer)
After both of this point done, you can start the Sonic Analysis directly from the Music Server, after the analysis is completed you can run the integrated Sonic Analysis function that now are:
- Instan mix for both Artist and Song
- Sonic Path
- Sonic Fingerprint
- Music Map
- Song Alchemy
IMPORTANT: This is a Open Subsonic API compliant server, so you need to configure AudioMuse-AI with the navidrome deployment, setting url, user and password correctly.
This is instruction to run both backend and frontned on your developing environment
Going in /music-server-backend/
go mod init music-server-backend
go mod tidy
go build -o music-server
./music-server
API will be reacheable on http://localhost:8080/rest/
API actually exposed:
[GIN-debug] GET /rest/ping.view --> main.subsonicPing (4 handlers)
[GIN-debug] GET /rest/getOpenSubsonicExtensions.view --> main.subsonicGetOpenSubsonicExtensions (4 handlers)
[GIN-debug] GET /rest/getLicense.view --> main.subsonicGetLicense (5 handlers)
[GIN-debug] GET /rest/stream.view --> main.subsonicStream (5 handlers)
[GIN-debug] GET /rest/scrobble.view --> main.subsonicScrobble (5 handlers)
[GIN-debug] GET /rest/getArtists.view --> main.subsonicGetArtists (5 handlers)
[GIN-debug] GET /rest/getAlbumList2.view --> main.subsonicGetAlbumList2 (5 handlers)
[GIN-debug] GET /rest/getPlaylists.view --> main.subsonicGetPlaylists (5 handlers)
[GIN-debug] GET /rest/getPlaylist.view --> main.subsonicGetPlaylist (5 handlers)
[GIN-debug] GET /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] POST /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] PUT /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] PATCH /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] HEAD /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] OPTIONS /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] DELETE /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] CONNECT /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] TRACE /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] GET /rest/updatePlaylist.view --> main.subsonicUpdatePlaylist (5 handlers)
[GIN-debug] GET /rest/deletePlaylist.view --> main.subsonicDeletePlaylist (5 handlers)
[GIN-debug] GET /rest/getAlbum.view --> main.subsonicGetAlbum (5 handlers)
[GIN-debug] GET /rest/search2.view --> main.subsonicSearch2 (5 handlers)
[GIN-debug] GET /rest/search3.view --> main.subsonicSearch2 (5 handlers)
[GIN-debug] GET /rest/getSong.view --> main.subsonicGetSong (5 handlers)
[GIN-debug] GET /rest/getRandomSongs.view --> main.subsonicGetRandomSongs (5 handlers)
[GIN-debug] GET /rest/getSongsByGenre.view --> main.subsonicGetSongsByGenre (5 handlers)
[GIN-debug] GET /rest/getCoverArt.view --> main.subsonicGetCoverArt (5 handlers)
[GIN-debug] GET /rest/startScan.view --> main.subsonicStartScan (5 handlers)
[GIN-debug] POST /rest/startScan.view --> main.subsonicStartScan (5 handlers)
[GIN-debug] PUT /rest/startScan.view --> main.subsonicStartScan (5 handlers)
[GIN-debug] PATCH /rest/startScan.view --> main.subsonicStartScan (5 handlers)
[GIN-debug] HEAD /rest/startScan.view --> main.subsonicStartScan (5 handlers)
[GIN-debug] OPTIONS /rest/startScan.view --> main.subsonicStartScan (5 handlers)
[GIN-debug] DELETE /rest/startScan.view --> main.subsonicStartScan (5 handlers)
[GIN-debug] CONNECT /rest/startScan.view --> main.subsonicStartScan (5 handlers)
[GIN-debug] TRACE /rest/startScan.view --> main.subsonicStartScan (5 handlers)
[GIN-debug] GET /rest/getScanStatus.view --> main.subsonicGetScanStatus (5 handlers)
[GIN-debug] GET /rest/getLibraryPaths.view --> main.subsonicGetLibraryPaths (5 handlers)
[GIN-debug] POST /rest/addLibraryPath.view --> main.subsonicAddLibraryPath (5 handlers)
[GIN-debug] POST /rest/updateLibraryPath.view --> main.subsonicUpdateLibraryPath (5 handlers)
[GIN-debug] POST /rest/deleteLibraryPath.view --> main.subsonicDeleteLibraryPath (5 handlers)
[GIN-debug] GET /rest/getUsers.view --> main.subsonicGetUsers (5 handlers)
[GIN-debug] GET /rest/createUser.view --> main.subsonicCreateUser (5 handlers)
[GIN-debug] GET /rest/updateUser.view --> main.subsonicUpdateUser (5 handlers)
[GIN-debug] GET /rest/deleteUser.view --> main.subsonicDeleteUser (5 handlers)
[GIN-debug] GET /rest/changePassword.view --> main.subsonicChangePassword (5 handlers)
[GIN-debug] GET /rest/getConfiguration.view --> main.subsonicGetConfiguration (5 handlers)
[GIN-debug] GET /rest/setConfiguration.view --> main.subsonicSetConfiguration (5 handlers)
[GIN-debug] GET /rest/getSimilarSongs.view --> main.subsonicGetSimilarSongs (5 handlers)
[GIN-debug] GET /rest/getSongPath.view --> main.subsonicGetSongPath (5 handlers)
[GIN-debug] GET /rest/getSonicFingerprint.view --> main.subsonicGetSonicFingerprint (5 handlers)
[GIN-debug] GET /rest/star.view --> main.subsonicStar (5 handlers)
[GIN-debug] GET /rest/unstar.view --> main.subsonicUnstar (5 handlers)
[GIN-debug] GET /rest/getStarred.view --> main.subsonicGetStarred (5 handlers)
[GIN-debug] GET /rest/getGenres.view --> main.subsonicGetGenres (5 handlers)
[GIN-debug] GET /rest/getApiKey.view --> main.subsonicGetApiKey (5 handlers)
[GIN-debug] POST /rest/revokeApiKey.view --> main.subsonicRevokeApiKey (5 handlers)
[GIN-debug] GET /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] POST /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] PUT /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] PATCH /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] HEAD /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] OPTIONS /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] DELETE /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] CONNECT /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] TRACE /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] GET /rest/getSonicAnalysisStatus.view --> main.subsonicGetSonicAnalysisStatus (5 handlers)
[GIN-debug] GET /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] POST /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] PUT /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] PATCH /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] HEAD /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] OPTIONS /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] DELETE /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] CONNECT /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] TRACE /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] GET /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] POST /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] PUT /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] PATCH /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] HEAD /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] OPTIONS /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] DELETE /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] CONNECT /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] TRACE /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] POST /api/v1/user/login --> main.loginUser (4 handlers)
[GIN-debug] GET /api/v1/user/me --> main.userInfo (5 handlers)
[GIN-debug] GET /api/v1/admin/browse --> main.browseFiles (6 handlers)
[GIN-debug] POST /api/v1/admin/scan/cancel --> main.cancelAdminScan (6 handlers)
[GIN-debug] POST /api/v1/admin/scan/rescan --> main.rescanAllLibraries (6 handlers)
[GIN-debug] POST /api/cleaning/start --> main.CleaningStartHandler (6 handlers)
[GIN-debug] POST /api/alchemy --> main.AlchemyHandler (4 handlers)
[GIN-debug] GET /api/map --> main.MapHandler (5 handlers)
[GIN-debug] GET /api/voyager/search_tracks --> main.VoyagerSearchTracksHandler (5 handlers)
[GIN-debug] POST /api/map/create_playlist --> main.MapCreatePlaylistHandler (5 handlers)
[GIN-debug] GET /static/*filepath --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (4 handlers)
[GIN-debug] HEAD /static/*filepath --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (4 handlers)
[GIN-debug] GET /favicon.ico --> main.main.(*RouterGroup).StaticFile.func14 (4 handlers)
[GIN-debug] HEAD /favicon.ico --> main.main.(*RouterGroup).StaticFile.func14 (4 handlers)
[GIN-debug] GET /manifest.json --> main.main.(*RouterGroup).StaticFile.func15 (4 handlers)
[GIN-debug] HEAD /manifest.json --> main.main.(*RouterGroup).StaticFile.func15 (4 handlers)
Goining /music-server-frontend/
npm install
npm start
Frontend will be reacheable on http://localhost:3000/ you can do the first login with admin/admin
IMPORTANT as you can see, running the code OUT of the container, you had the front-end on the different port 3000
