musikcube 3.0.5 配置参数详解

把 musikcube 3.0.5 全部配置文件的存放位置、字段含义、默认值与修改方法一次讲清,并给出 headless 服务端的可落地配置模板。本文所有文件路径、字段名与默认值均为 Ubuntu 22.04 实机运行 musikcube 3.0.5 后从配置目录逐文件实测采集,websocket/HTTP 行为经 curl 与 websocket 客户端实测验证。

musikcubemusikcube音乐2026/10/30

musikcube 3.0.5 配置参数详解

目标:把 musikcube 3.0.5 全部配置文件的存放位置、字段含义、默认值与修改方法一次讲清,并给出 headless 服务端的可落地配置模板。本文所有文件路径、字段名与默认值均为 Ubuntu 22.04 实机运行 musikcube 3.0.5 后从配置目录逐文件实测采集,websocket/HTTP 行为经 curl 与 websocket 客户端实测验证。

一、环境信息

  • 实测系统:Ubuntu 22.04(x86_64),musikcube 3.0.5(官方 deb 安装,含 musikcube TUI 与 musikcubed daemon 两个入口)
  • 配置目录:~/.config/musikcube/(以 root 运行为 /root/.config/musikcube/)
  • 服务端配置:plugin_musikcubeserver(wss,http).json(websocket 7905 + HTTP 7906,默认开启)
  • 验证方式:TUI 生成初始配置后逐文件 cat 实测;修改后重启 daemon,经 ws://127.0.0.1:7905(认证回显 api_version 20、app_version 3.0.5)与 http://127.0.0.1:7906(Basic 认证音频流 200/401)验证生效

二、前置条件

  • 已按《Ubuntu 22.04 安装 musikcube 3.0.5 指南》完成安装,which musikcube musikcubed 返回 /usr/bin/ 下两个可执行文件;
  • 对 TUI 用户:至少启动过一次 musikcube(首次启动会生成全部初始配置文件);
  • 对 daemon 用户:~/.config/musikcube/ 已存在(可先跑一次 TUI 生成,也可以手工创建后从零写配置);
  • 修改 JSON 建议使用 python3 -m json.tool 校验格式,musikcube 启动时解析失败的 JSON 会被当作未配置处理。

三、参数查看与修改方式

musikcube 的参数分两层:TUI 设置界面(交互修改,退出时写回 JSON)与配置文件(可直接编辑,headless 场景唯一手段)。二者的关系经实测确认如下:

  1. TUI 设置界面(settings 视图,快捷键 s)覆盖:library type、locale、output driver、颜色主题、server setup(服务端密码/端口/转码)、key bindings 等;每次正常退出(^D)时把内存中的配置写回 JSON 文件。
  2. JSON 配置文件是唯一事实来源,daemon(musikcubed)启动时只读文件、不开 TUI。实测直接编辑 plugin_musikcubeserver(wss,http).json 写入 password 后重启 daemon,websocket 认证即用新密码通过——headless 服务器上无需进 TUI 也能完成服务端配置。
  3. ⚠️ TUI 退出时会全量写回配置文件:若 TUI 与手工编辑交叉进行,后退出的一方覆盖另一方。先改文件、后开 TUI 的顺序会导致手工修改丢失;正确顺序是「先退出 TUI → 再编辑 JSON → 再启动 daemon」。

查看配置全貌:

ls -la ~/.config/musikcube/

实测回显:

drwxr-xr-x 4 root root 4096 Oct 29 14:30 .
drwxr-xr-x 3 root root 4096 Oct 29 14:30 ..
drwxr-xr-x 3 root root 4096 Oct 29 14:30 1
drwxr-xr-x 3 root root 4096 Oct 29 14:30 cache
-rw-r--r-- 1 root root 2174 Oct 29 14:33 hotkeys.json
-rw-r--r-- 1 root root   63 Oct 29 14:33 libraries.json
-rw-r--r-- 1 root root 2576 Oct 29 14:33 log.txt
-rw-r--r-- 1 root root    4 Oct 29 14:30 plugin_gmeidecoder.json
-rw-r--r-- 1 root root    4 Oct 29 14:30 plugin_httpidatastream.json
-rw-r--r-- 1 root root    4 Oct 29 14:30 plugin_libopenmptidecoder.json
-rw-r--r-- 1 root root  259 Oct 29 14:33 plugin_musikcubeserver(wss,http).json
-rw-r--r-- 1 root root    4 Oct 29 14:30 plugin_nullioutput.json
-rw-r--r-- 1 root root    4 Oct 29 14:30 plugin_supereqidsp.json
-rw-r--r-- 1 root root   30 Oct 29 14:33 session.json
-rw-r--r-- 1 root root  826 Oct 29 14:33 settings.json
-rw-r--r-- 1 root root  277 Oct 29 14:33 stderr.txt

各文件职责:

文件职责谁写
settings.jsonTUI 全局设置(界面/曲库/远程库客户端参数)TUI 退出时写回
plugin_musikcubeserver(wss,http).json流服务端:端口/密码/转码TUI server setup 或手工
hotkeys.json快捷键绑定TUI(按 ? 打开快捷键界面后生成)
libraries.json本地库与远程库的默认 ID 映射TUI/服务端
session.json播放队列会话快照(SaveSessionOnExit)TUI/daemon 退出时
plugin_*.json(值为 null)对应插件的空配置占位首次启动生成
1/本地曲库 SQLite 数据库(musik.db + wal/shm)与缩略图 thumbs/索引器
cache/transcoder/按需转码缓存(<哈希>-<码率>.mp3)流服务
log.txt / stderr.txt运行日志与 stderr 捕获运行时追加

四、参数总览

4.1 settings.json(TUI 全局设置)

首启生成的默认值全文实测(826 字节):

{
  "AppQuitKey": "^D",
  "AutoHideCommandBar": false,
  "AutoUpdateCheck": true,
  "ColorTheme": "",
  "DisableCustomColors": false,
  "IndexerLogEnabled": false,
  "IndexerThreadCount": 4,
  "InheritBackgroundColor": false,
  "LibraryType": 1,
  "Locale": "en_US",
  "MinimizeToTray": false,
  "PiggyEnabled": false,
  "RemoteLibraryHostname": "127.0.0.1",
  "RemoteLibraryHttpPort": 7906,
  "RemoteLibraryHttpTls": false,
  "RemoteLibraryLatencyTimeoutMs": 5000,
  "RemoteLibraryPassword": "",
  "RemoteLibraryTranscoderBitrate": 192,
  "RemoteLibraryTranscoderEnabled": false,
  "RemoteLibraryTranscoderFormat": "ogg",
  "RemoteLibraryWssPort": 7905,
  "RemoteLibraryWssTls": false,
  "RemoveMissingFiles": true,
  "SaveSessionOnExit": true,
  "StartMinimized": false,
  "SyncOnStartup": true,
  "UsePaletteColors": true
}

4.2 plugin_musikcubeserver(wss,http).json(流服务端)

TUI 首启生成、手工写入密码后的实测全文:

{
  "debug": false,
  "http_server_enabled": true,
  "http_server_port": 7906,
  "password": "q1w2e3r4",
  "transcoder_cache_count": 50,
  "transcoder_synchronous": false,
  "transcoder_synchronous_fallback": false,
  "use_ipv6": false,
  "websocket_server_enabled": true,
  "websocket_server_port": 7905
}

4.3 libraries.json 与 session.json

// libraries.json(实测)
{
  "default-local-library": 1,
  "default-remote-library": 2
}
// session.json(实测,随退出写回)
{
  "LastPlayQueueIndex": -1
}

hotkeys.json 是「快捷键 ID → 键名」的大表(50 余键),结构见第五章 5.3。

五、核心参数分类详解

5.1 曲库与索引参数(settings.json)

参数默认值说明
LibraryType1曲库类型:1=本地库。设为 2 时 TUI 变成远程库客户端(连别人的 musikcube 服务端),此时生效的是下面 RemoteLibrary* 一组参数
SyncOnStartuptrue启动时自动扫描音乐目录;daemon 模式同样遵守此参数,改库后重启服务即可重新索引
IndexerThreadCount4索引扫描并发线程数。大曲库(10 万级)可调到 8;低配 NAS 建议降到 2
IndexerLogEnabledfalse打开后 log.txt 里输出逐文件索引日志,排障索引漏扫时用
RemoveMissingFilestrue扫描时自动从库中删除已消失的文件。音乐目录挂载点掉线时会导致清库,NAS 场景建议改 false
metadata_rescan(hotkeys)^RTUI 内手动触发重扫的快捷键

实测验证:向 /music 目录放入 2 个测试音轨后通过 websocket 发送 run_indexer(或重启 daemon),SQLite 曲库即时出现两条记录:

1|/music/test_tone.wav|local-3777212199-2477513281|30|2646044
2|/music/test_tone.mp3|local-3777198585-312182025|25|401284

💡 技术拓展:musikcube 的远程库参数(RemoteLibrary*)与服务端参数(plugin_musikcubeserver)是同一协议的两侧——任何一台 musikcube 都可以既是服务端(对外开放 7905/7906)又是客户端(RemoteLibrary* 指向别机)。常见同类「客户端-服务端」音乐架构对比:

架构代表客户端身份
服务即客户端musikcube自身 TUI + musikdroid
纯服务端Navidrome/gonicSubsonic 生态任意客户端
多协议网关mpd/MPRIS专用协议客户端

musikcube 没有网页端,远程消费只走 musikdroid 或按其 websocket 协议自制客户端。

5.2 流服务端参数(plugin_musikcubeserver(wss,http).json)

参数默认值说明
websocket_server_enabledtruewebsocket 控制服务开关(元数据/播放控制/状态广播)
websocket_server_port7905websocket 监听端口
http_server_enabledtrueHTTP 音频流服务开关(原始流 + 转码流下发)
http_server_port7906HTTP 监听端口
password""(空)远程访问密码,明文存储。空密码时远程认证失败;实测写入 q1w2e3r4 重启 daemon 后,websocket 认证返回 "authenticated": true,HTTP Basic 用 default:q1w2e3r4 拉流返回 200,错误密码返回 401
use_ipv6false监听栈。内网纯 IPv4 环境保持 false 可避免双栈监听的绑定歧义
transcoder_cache_count50转码缓存保留份数(实测缓存文件落 cache/transcoder/<哈希>-<码率>.mp3)。磁盘紧张可降到 10
transcoder_synchronousfalsefalse=异步转码(首个请求实时转、边转边发);true=同步转码(转完再发,首包延迟高但可 seek)
transcoder_synchronous_fallbackfalse异步转码失败时是否回退同步转码
debugfalse服务端调试日志

转码行为实测(25 秒 128k mp3 源,请求 64k 码率):

HTTP 200, 192001 bytes, application/octet-stream
cache/transcoder/12584269625272509693-64.mp3   # 转码产物落缓存

原始流实测(同一文件不带 bitrate 参数):

HTTP 200, 401284 bytes, audio/mpeg

💡 技术拓展:「转码缓存计数」是 musikcube 特有的环形缓存策略(按份数淘汰),同类流服务的转码缓存对比:

策略代表特点
按份数环形淘汰musikcube(transcoder_cache_count)简单可控,粒度是「一份转码产物」
按容量/时间淘汰Navidrome需要配目录大小上限
不缓存(实时转)gonic 部分路径磁盘零占用,CPU 重复开销

客户端多为移动网络场景、码率档位有限时,50 份缓存足够命中常听曲目。

5.3 快捷键参数(hotkeys.json)

hotkeys.json 在 TUI 内按 ? 打开快捷键界面后生成/更新,格式为「动作 ID → 键名」。实测生成的完整键表(节选,全表以文件为准):

{
  "browse_category_filter": "^F",
  "browse_playlists_delete": "KEY_DC",
  "browse_playlists_new": "M-n",
  "browse_playlists_rename": "M-r",
  "browse_playlists_save": "M-s",
  "context_menu": "M-enter",
  "metadata_rescan": "^R",
  "navigate_console": "`",
  "navigate_hotkeys": "?",
  "navigate_library": "a",
  "navigate_library_browse_albums": "2",
  "navigate_library_browse_artists": "1",
  "navigate_library_browse_directories": "d",
  "navigate_library_browse_genres": "3",
  "navigate_library_filter": "f",
  "navigate_library_play_queue": "n",
  "navigate_library_playlists": "5",
  "navigate_library_tracks": "t",
  "navigate_settings": "s",
  "play_queue_move_down": "CTL_DOWN",
  "play_queue_move_up": "CTL_UP",
  "playback_next": "l",
  "playback_previous": "j",
  "playback_seek_back": "u",
  "playback_seek_forward": "o",
  "playback_stop": "^X",
  "playback_toggle_mute": "m",
  "playback_toggle_pause": "^P",
  "playback_toggle_repeat": ".",
  "playback_toggle_shuffle": ",",
  "playback_volume_down": "k",
  "playback_volume_up": "i"
}

键名语法:M- 前缀 = Meta 键(Linux 终端通常是左 Alt);^ 前缀 = Ctrl;特殊键用 ncurses 键名(KEY_DC 删除键、KEY_NPAGE 翻页等)。改完重启 musikcube 生效,TUI 的 settings → key bindings 里有按键测试器可验证键名。

5.4 远程库客户端参数(settings.json 中 RemoteLibrary*)

当 LibraryType 设为 2(把本机 TUI 当作远程库客户端)时生效:

参数默认值说明
RemoteLibraryHostname127.0.0.1服务端地址
RemoteLibraryWssPort7905对端 websocket 端口
RemoteLibraryHttpPort7906对端 HTTP 流端口
RemoteLibraryWssTls / RemoteLibraryHttpTlsfalse是否走 TLS(服务端本身无 TLS,此参数用于前置反代终结 SSL 的场景)
RemoteLibraryPassword""对端服务密码
RemoteLibraryTranscoderEnabledfalse客户端侧启用降码率
RemoteLibraryTranscoderBitrate192降码率请求的码率(kbps)
RemoteLibraryTranscoderFormatogg期望转码格式
RemoteLibraryLatencyTimeoutMs5000连接超时(毫秒)

实测补充:TUI 在无服务端环境下启动时会尝试连远程库,stderr.txt 记录失败信息(属正常现象):

[2026-10-29 14:33:35] [info] asio async_connect error: asio.system:111 (Connection refused)

5.5 输出与外观参数

参数位置默认值说明
输出驱动settings(TUI)实测显示 Null无声卡环境自动回退 Null;有声卡时可选 alsa/pulse/pipewire
ColorThemesettings.json""空=default 主题;主题文件随包发布
UsePaletteColorssettings.jsontrue用终端 256 色调色板,老终端可关
DisableCustomColorssettings.jsonfalse完全禁用自定义颜色(极简终端)
InheritBackgroundColorsettings.jsonfalse继承终端背景色(透明终端用)
AppQuitKeysettings.json^D退出键,可改
AutoHideCommandBarsettings.jsonfalse自动隐藏底部命令栏

无输出设备时的实测证据(log.txt,插件按需加载、缺库自动跳过):

14:33:35 [error] [PluginFactory] exception while loading plugin /usr/share/musikcube/plugins/libalsaout.so: libasound.so.2: cannot open shared object file
14:33:35 [error] [PluginFactory] exception while loading plugin /usr/share/musikcube/plugins/libpulseout.so: libpulse.so.0: cannot open shared object file
14:33:35 [info] [PluginFactory] loaded: /usr/share/musikcube/plugins/libserver.so

六、headless 服务端生产配置模板

适用场景:无头 Linux 服务器/NAS(2GB 内存以上、NVMe 或 SSD),运行 musikcubed 常驻流服务,musikdroid 局域网+反代公网访问。逐文件给出(密码为本系列文档统一演示口令):

// ~/.config/musikcube/plugin_musikcubeserver(wss,http).json
{
  "debug": false,
  "http_server_enabled": true,
  "http_server_port": 7906,
  "password": "q1w2e3r4",
  "transcoder_cache_count": 50,
  "transcoder_synchronous": false,
  "transcoder_synchronous_fallback": false,
  "use_ipv6": false,
  "websocket_server_enabled": true,
  "websocket_server_port": 7905
}
// ~/.config/musikcube/settings.json(headless 场景关键项)
{
  "AppQuitKey": "^D",
  "AutoUpdateCheck": false,
  "IndexerThreadCount": 4,
  "LibraryType": 1,
  "RemoveMissingFiles": false,
  "SaveSessionOnExit": true,
  "SyncOnStartup": true
}

配置要点:

  1. RemoveMissingFiles=false:音乐目录多为挂载卷,挂载掉线时避免索引清库;
  2. AutoUpdateCheck=false:服务器环境无意义且减少外联;
  3. transcoder_synchronous=false:保持异步转码,首播延迟低;公网弱网客户端靠 ?bitrate= 按需降码率;
  4. 端口 7905/7906 仅监听局域网可达地址,公网一律前置 nginx/caddy 做 TLS 终结后再暴露(服务端本身无 TLS,密码明文存盘);
  5. 修改后 musikcubed --stop && musikcubed --start 生效(stop 的回显异常见安装篇 FAQ)。

生效验证(三连实测):

musikcubed --running
curl -s -o /dev/null -w '%{http_code}\n' -u default:q1w2e3r4 http://127.0.0.1:7906/audio/external_id/local-3777198585-312182025

实测回显:第一条 musikcubed is running with pid 751;第二条 200。

七、常见问题

Q1:headless 服务器没开过 TUI,配置文件从哪来? 先任意方式启动一次 musikcube(SSH 里跑 TUI 再退出,或本地跑一次),全部初始配置即生成;之后只改文件即可。也可以手工创建目录与 JSON 从零配置(字段照本文第四章抄)。

Q2:改了 plugin json 里的密码,musikdroid 连不上? 确认顺序:TUI 若在配置修改后退出过,会覆盖手工值。重新 cat 文件确认密码仍在;再确认 musikdroid 填的是 websocket 端口(默认 7905)而非 HTTP 端口。

Q3:转码请求返回 0 字节? 实测发现个别不合规范的 wav 源会导致 ffmpeg 解码器报 swr_convert_frame() failed: Input changed(log.txt 可见)而转码产物为空;换成常规 mp3/flac 源后转码正常(返回 192001 字节缓存文件)。遇到时先看 log.txt 再确认源文件完整性。

Q4:daemon 启动后配置没生效? musikcubed 是 shell 封装,实际执行 cd /usr/share/musikcube && exec ./musikcubed "$@",配置永远从当前用户的 ~/.config/musikcube/ 读取。用 systemd 托管时注意 User= 指定谁,配置就在谁的 HOME 下。

八、参考链接