No description
  • TypeScript 81.1%
  • HTML 18.9%
Find a file
2026-05-17 07:12:46 +08:00
.github/workflows BIG Major changes such as new rest endpoints, cleaned up code, and better support for post requests, also dino music compat. 2026-02-07 22:16:02 +08:00
src 0.7.7, Greatly improved AudioMuse integration. 2026-05-17 07:12:46 +08:00
.dockerignore Support for custom UI Frontend 2025-07-19 13:56:42 +08:00
.gitignore getSimilarSongs Timeout, download Content-Length, getArtistInfo/getAlbumInfo large, medium, and large urls. v0.6.9 2026-02-22 01:23:04 +08:00
deno.json getSimilarSongs Timeout, download Content-Length, getArtistInfo/getAlbumInfo large, medium, and large urls. v0.6.9 2026-02-22 01:23:04 +08:00
Dockerfile Experimental jukebox feature. May or may not work properly depending on your app. 2025-08-02 20:36:41 +08:00
LICENSE Initial commit 2025-02-19 19:47:16 +08:00
README.md 0.7.6, Sonic SImilar Tracks does not include the seed song anymore, README modified. 2026-05-16 11:55:02 +08:00


Logo

Dinosonic

Dinosonic is a fast, lightweight music streaming server built with Deno, inspired by the Subsonic API.


License: GPL v3 GitHub Actions Workflow Status Docker Image

Features

  • Subsonic API Compatibility Works with many Subsonic clients and supports key OpenSubsonic extensions.
  • Metadata Extraction Uses built-in parsers and FFmpeg (optional) to retrieve music metadata.
  • MusicBrainz Integration Fetches metadata, genres, tags, release information, and high-quality cover art from MusicBrainz Cover Art Archive. Automatically fills missing genre data and supports automatic searching.
  • Multi-Source Cover Art Intelligent cover art prioritization from embedded files, local images, MusicBrainz Cover Art Archive, Last.fm, and Spotify.
  • Lyrics Support Fetches and serves both synced (LRC) and unsynced lyrics via MusixMatch integration.
  • Last.fm Integration Fetches metadata, OAuth-based scrobbling, and automatic starred track synchronization with Last.fm loved tracks.
  • Spotify Integration Fetches high-quality artist cover art.
  • ListenBrainz Scrobbling Per-user token support for scrobbling to ListenBrainz.
  • Playlist Management Automatic cover art generation and dynamic updates based on playlist content.
  • User-Specific Data Tracks starred items, play counts, ratings, and play history per user.
  • API Key Authentication Generate and manage persistent API keys with deep linking support for easy mobile app setup.
  • Transcoding Profiles Per-user transcoding profiles with customizable audio format, bitrate, and client-specific settings.
  • Admin Panel Comprehensive web interface for user management, API keys, Last.fm/ListenBrainz configuration, transcoding profiles, and library scanning controls.
  • Custom Web Frontend Support Serve any plain HTML, CSS, and JS frontend from the ui/ folder.
  • Docker Support Easy deployment with environment variables and docker-compose.
  • Standalone Executable Runs as a single executable with no external runtime dependencies (once compiled).
  • Sonic Similarity Audio-based song similarity and pathfinding via AudioMuse-AI integration (OpenSubsonic sonicSimilarity extension).

Installation

docker run -d --name dinosonic \
  -p 4100:4100 \
  -v /path/to/music:/music:ro \
  -v /path/to/data:/data \
  -e DINO_PORT=4100 \
  -e DINO_LOG_LEVEL=INFO \
  -e DINO_DATA_FOLDER=/data \
  -e DINO_MUSIC_FOLDERS=/music \
  -e DINO_SCAN_ON_START=true \
  -e DINO_SCAN_INTERVAL=1d \
  -e DINO_ARTIST_SEPARATORS=';/' \
  -e DINO_GENRE_SEPARATORS=';,' \
  -e DINO_DEFAULT_ADMIN_PASSWORD=admin \
  ghcr.io/dinosoftware/dinosonic:latest

Or as a docker compose:

services:
    dinosonic:
        image: ghcr.io/dinosoftware/dinosonic:latest
        container_name: dinosonic
        restart: unless-stopped
        ports:
            - '4100:4100'
        volumes:
            - /path/to/music:/music:ro
            - /path/to/data:/data
            #- /path/to/ui:/ui:ro # If you're planning to have a custom frontend at /
        environment:
            DINO_PORT: 4100
            DINO_LOG_LEVEL: INFO
            DINO_DATA_FOLDER: /data
            DINO_MUSIC_FOLDERS: /music
            DINO_SCAN_ON_START: true
            DINO_SCAN_INTERVAL: 1d
            DINO_ARTIST_SEPARATORS: ';/'
            DINO_GENRE_SEPARATORS: ';,'
            DINO_DEFAULT_ADMIN_PASSWORD: admin
            # Optional configuration variable
            # DINO_UI_FOLDER: /ui
            # Optional Last.fm configuration
            # DINO_LASTFM_ENABLED: true
            # DINO_LASTFM_SCROBBLING: true
            # DINO_LASTFM_APIKEY: your_lastfm_api_key
            # DINO_LASTFM_APISECRET: your_lastfm_api_secret
            # Optional MusicBrainz configuration
            # DINO_MUSICBRAINZ_ENABLED: true
            # Optional Spotify configuration
            # DINO_SPOTIFY_ENABLED: true
            # DINO_SPOTIFY_CLIENT_ID: your_spotify_client_id
            # DINO_SPOTIFY_CLIENT_SECRET: your_spotify_client_secret
            # Optional ListenBrainz configuration
            # DINO_LISTENBRAINZ_SCROBBLING: true
            # Optional Transcoding configuration
            # DINO_TRANSCODING_ENABLED: false
            # DINO_FFMPEG_PATH: ffmpeg
            # Optional Audio Similarity (requires AudioMuse-AI)
            # DINO_AUDIO_SIMILARITY_ENABLED: true
            # DINO_AUDIOMUSE_URL: http://audiomuse:8000
            # DINO_AUDIOMUSE_API_TOKEN: your_audiomuse_api_token

Environment Variables

Variable Description Default
DINO_PORT Server port 4100
DINO_LOG_LEVEL Logging level (OFF, INFO, DEBUG, WARNING, ERROR) OFF
DINO_DATA_FOLDER Path for storing metadata, database, and covers. Required
DINO_UI_FOLDER Custom UI Frontend folder containing the static HTML, CSS, and JS. None
DINO_MUSIC_FOLDERS Semicolon-separated list of music folders (e.g., /music;/more_music). []
DINO_SCAN_ON_START Scan music library on startup (true/false). false
DINO_SCAN_INTERVAL Interval for rescanning (e.g., 1d, 12h, 1hr 25m 10s). 1d
DINO_ARTIST_SEPARATORS Characters used to separate multiple artists in tags (e.g., ';/'). ';/'
DINO_GENRE_SEPARATORS Characters used to separate multiple genres in tags (e.g., ';,'). ';,'
DINO_DEFAULT_ADMIN_PASSWORD Default password for the 'admin' user. Only used for the first initialization. adminPassword
DINO_LASTFM_ENABLED Enable Last.fm metadata fetching (true/false). false
DINO_LASTFM_SCROBBLING Enable Last.fm scrobbling and loved track sync (true/false). (Implies Last.fm enabled) false
DINO_LASTFM_APIKEY Last.fm API key. *Required if DINO_LASTFM_ENABLED or DINO_LASTFM_SCROBBLING is true. None*
DINO_LASTFM_APISECRET Last.fm API secret. *Required if DINO_LASTFM_SCROBBLING is true. None*
DINO_MUSICBRAINZ_ENABLED Enable MusicBrainz metadata and cover art fetching (true/false). true
DINO_SPOTIFY_ENABLED Enable Spotify integration for artist cover art (true/false). false
DINO_SPOTIFY_CLIENT_ID Spotify Client ID. *Required if DINO_SPOTIFY_ENABLED is true. None*
DINO_SPOTIFY_CLIENT_SECRET Spotify Client Secret. *Required if DINO_SPOTIFY_ENABLED is true. None*
DINO_LISTENBRAINZ_SCROBBLING Enable ListenBrainz scrobbling (true/false). Tokens set per-user in admin panel. false
DINO_TRANSCODING_ENABLED Enable FFmpeg-based transcoding for streaming and cover art resizing (true/false). false
DINO_FFMPEG_PATH Path to ffmpeg binary. ffmpeg
DINO_AUDIO_SIMILARITY_ENABLED Enable audio-based similarity via AudioMuse-AI (true/false). false
DINO_AUDIOMUSE_URL AudioMuse-AI server URL. *Required if DINO_AUDIO_SIMILARITY_ENABLED is true. None*
DINO_AUDIOMUSE_API_TOKEN AudioMuse-AI API token (Bearer auth). *Required when AudioMuse auth is enabled. None*

Running as a Standalone Executable

You can compile Dinosonic into a single executable for various platforms. Build tasks are defined in deno.json (e.g., deno task build:linux, deno task build).

Command Line Arguments

Dinosonic supports the following command-line arguments:

dinosonic [OPTIONS...]
  • -h, --help: Display help and exit.
  • -v, --version: Display the current version of Dinosonic.
  • -c, --config /path/to/config.toml: Set the config file location. If not provided, Dinosonic will try to use environment variables.
Linux/macOS
# Make sure the compiled binary is executable
chmod +x dinosonic-linux-x86 # or dinosonic-mac-x86, etc.

# Run with a config file
./dinosonic-linux-x86 --config /path/to/your/config.toml

# Or run using environment variables (see Docker section for variables)
# export DINO_DATA_FOLDER=/data
# export DINO_MUSIC_FOLDERS=/music
# ... and so on
# ./dinosonic-linux-x86
Windows
# Run with a config file
.\dinosonic-win-x86.exe --config "C:\\path\\to\\your\\config.toml"

# Or run using environment variables (see Docker section for variables)
# $env:DINO_DATA_FOLDER = "C:\\dinosonic_data"
# $env:DINO_MUSIC_FOLDERS = "C:\\music"
# ... and so on
# .\dinosonic-win-x86.exe
Config File (`config.toml`)

If you prefer, you can use a TOML configuration file instead of environment variables when running the standalone executable.

port = 4100
log_level = "INFO" # Options: "OFF", "DEBUG", "INFO", "WARNING", "ERROR"
data_folder = "/path/to/dataDir"
ui_folder = "/path/to/ui" # If you plan on having a custom frontend
music_folders = [ "/path/to/music", "/path/to/another/music_folder" ]
default_admin_password = "yourSecureAdminPassword" # Only used on first run
scan_on_start = true
scan_interval = "1d" # e.g., "1d", "12h", "30m"
artist_separators = [";", "/"]
genre_separators = [";", ","]

[transcoding]
enabled = false
ffmpeg_path = "ffmpeg" # Path to ffmpeg binary

[last_fm]
enabled = false # For metadata fetching
enable_scrobbling = false # For scrobbling and loved track sync (implies 'enabled' is true)
api_key = "your_lastfm_api_key"
api_secret = "your_lastfm_api_secret" # Required if enable_scrobbling is true

[musicbrainz]
enabled = false # For MusicBrainz metadata and cover art fetching

[spotify]
enabled = false # For artist image fetching
client_id = "your_spotify_client_id"
client_secret = "your_spotify_client_secret"

[listenbrainz]
enable_scrobbling = false # For ListenBrainz scrobbling (tokens set per-user in admin panel)

[audio_similarity]
enabled = false # For audio-based song similarity (requires AudioMuse-AI)
audiomuse_url = "http://localhost:8000" # URL of your AudioMuse-AI instance
api_token = "your_audiomuse_api_token" # Required when AudioMuse auth is enabled

Config File Options

Option Type Default Description
port number 4100 The port on which Dinosonic runs.
log_level string OFF Logging level (e.g., OFF, DEBUG, INFO, WARNING, ERROR).
data_folder string Required Path to store metadata, database, and covers.
ui_folder string None Custom UI Frontend folder containing the static HTML, CSS, and JS.
music_folders array [] List of directories containing music.
scan_on_start boolean false Whether to scan the music library on startup.
scan_interval string 1d Interval for rescanning (e.g., 1d, 12h, 30m, 1h 30m 10s).
artist_separators array [';', '/'] Characters used to split multiple artists in tags.
genre_separators array [';', ','] Characters used to split multiple genres in tags.
default_admin_password string adminPassword The default password for the 'admin' user. Only needed for the first initialization.

Transcoding Options ([transcoding])

Option Type Default Description
enabled boolean false Whether FFmpeg-based transcoding for streaming is enabled.
ffmpeg_path string ffmpeg Path to the FFmpeg executable.

Last.fm Options ([last_fm])

Option Type Default Description
enabled boolean false Enable Last.fm metadata fetching (artist/album info).
enable_scrobbling boolean false Enable Last.fm scrobbling and loved track sync. If true, enabled is also considered true.
api_key string None* Last.fm API key. *Required if enabled or enable_scrobbling is true.
api_secret string None* Last.fm API secret. *Required if enable_scrobbling is true for OAuth and signed API calls.

MusicBrainz Options ([musicbrainz])

Option Type Default Description
enabled boolean true Enable MusicBrainz metadata fetching, genre enrichment, and Cover Art Archive downloads.

Spotify Options ([spotify])

Option Type Default Description
enabled boolean false Whether Spotify integration for fetching artist images is enabled.
client_id string None* Spotify client ID. *Required if enabled is true.
client_secret string None* Spotify client secret. *Required if enabled is true.

ListenBrainz Options ([listenbrainz])

Option Type Default Description
enable_scrobbling boolean false Enable ListenBrainz scrobbling. User tokens configured in admin panel.

Audio Similarity Options ([audio_similarity])

Option Type Default Description
enabled boolean false Enable audio-based song similarity and pathfinding via AudioMuse-AI.
audiomuse_url string None* URL of the AudioMuse-AI instance. *Required if enabled is true.
api_token string None* AudioMuse-AI API token for Bearer auth. Required when AudioMuse auth is on.

API & Admin Panel

  • Subsonic API Compatible with existing Subsonic clients. Key OpenSubsonic extensions like formPost, songLyrics, transcodeOffset, and sonicSimilarity are supported.
  • API Keys Generate persistent API keys as an alternative to password authentication:
    • Create named API keys from the admin dashboard
    • View full API keys anytime (not one-time-only)
    • Copy to clipboard with one click
    • Deep linking support for easy mobile app configuration
    • Revoke keys when no longer needed
  • Transcoding Profiles Per-user transcoding profiles that allow custom audio format, bitrate, and client-specific settings.
  • Admin Panel Available at http://localhost:<DINO_PORT>/admin/.
    • Manage users: create, edit permissions (admin, settings, download, stream, scrobbling, etc.), delete.
    • API key management: create, view, copy, and revoke API keys.
    • Link/Unlink personal Last.fm account for scrobbling and loved track synchronization.
    • Configure ListenBrainz tokens for scrobbling.
    • Manage transcoding profiles per user.
    • Trigger library scans and view scan status.
    • View server version and statistics.

Roadmap

  • Multiple Music Folder Support Full implementation of music folders for library organization
  • Enhanced Statistics More detailed playback statistics and analytics in the Admin Panel
  • Advanced Search Improved search capabilities with filters and operators
  • Playlist Sharing Public playlist sharing with customizable permissions

Contributing

Feel free to contribute by submitting issues, feature requests, or pull requests at the Dinosonic GitHub Repository.


License

Dinosonic is licensed under the GNU General Public License v3 (GPLv3).