Skip to content

配置与设置 API

本文档基于以下源文件编写:

目录

  1. 设计概述
  2. 通用配置管理 /configs
  3. 业务设置 /settings

1. 设计概述

章节来源: AGENTS.md(配置接口规范)、internal/app/routers.go

Songloft 有两类配置接口,用户可见的功能开关一律走业务端点:

类型路径风格用途特点
业务设置/settings/<name>用户可见功能开关强类型 JSON、自带默认值、PUT 后触发副作用
通用 KV/configs/{key}admin 编辑器专用纯字符串 KV、PUT 时 key 不存在返回 404、无默认值

客户端业务功能一律走 /settings/* 端点(SettingsApi);/configs/{key} 仅供前端 config_manager.dart 通用配置编辑器使用(ConfigApi)。两者可读写同一底层 config key(保留双入口),副作用由 configHandler.SetOnConfigChanged 回调统一触发。


2. 通用配置管理 /configs

章节来源: internal/handlers/config.go

通用 KV 配置端点,供 admin 工具编辑任意配置项。新增业务功能应优先使用 /settings/* 端点。

GET /api/v1/configs

获取配置列表,按 key 升序排列,支持关键词搜索和分页。

  • 认证: Bearer Token
  • 查询参数:
参数类型必填说明
keywordstring搜索关键词(按 key 匹配)
limitint每页数量,默认 20
offsetint偏移量,默认 0
  • 200: {"configs": [Config], "total": 5, "limit": 20, "offset": 0}
  • 500: 服务器错误

POST /api/v1/configs

创建配置项。

  • 认证: Bearer Token
  • 请求体: {"key": "music_path", "value": "{\"path\":\"/music\"}"}(key 和 value 均必填)
  • 201: 返回 Config 对象(含 id/key/value/updated_at
  • 400: key 或 value 为空 | 500: 创建失败

GET /api/v1/configs/{key}

获取单个配置。

  • 认证: Bearer Token
  • 路径参数: key(string)
  • 200: 返回 Config 对象
  • 404: 配置不存在

PUT /api/v1/configs/{key}

更新已有配置。配置必须已存在,否则返回 404。更新后异步触发 onConfigChanged 回调(music_path 重建 Scanner,auto_scan 重启调度)。

  • 认证: Bearer Token
  • 路径参数: key(string)
  • 请求体: {"value": "new_value"}(value 必填)
  • 200: 返回更新后的 Config
  • 400: value 为空 | 404: key 不存在 | 500: 更新失败

DELETE /api/v1/configs/{key}

删除配置项。

  • 认证: Bearer Token
  • 路径参数: key(string)
  • 200: {"message": "配置已删除"}
  • 400: key 为空 | 500: 删除失败

3. 业务设置 /settings

章节来源: internal/handlers/scan.gohls.golog.gojsplugin_registry.gotab_config_setting.go

所有业务设置端点遵循统一模式:GET 返回当前配置(未配置时返回业务默认值),PUT 写入配置并触发相关副作用。所有端点均需 Bearer Token 认证。

3.1 音乐路径

GET /api/v1/settings/music-path -- 获取音乐路径与扫描排除配置。

PUT /api/v1/settings/music-path -- 更新配置,path 不能为空。

json
{
  "path": "music",
  "exclude_dirs": ["@eaDir", "tmp"],
  "exclude_paths": []
}
字段类型默认值说明
pathstring"music"音乐目录路径
exclude_dirsstring[]["@eaDir","tmp"]按目录名排除
exclude_pathsstring[][]按完整路径排除
  • PUT 副作用: 异步触发 onMusicPathChanged(重建 Scanner + 清理排除目录歌曲)
  • 400: path 为空 | 500: 保存失败

3.2 HLS 代理开关

GET/PUT /api/v1/settings/hls-proxy -- {"enabled": false}

默认关闭。关闭时电台 .m3u8 直接 302 给 player;开启后电台切片字节全部经本机转发,解决源站 Referer/CORS 拦截问题,但所有切片流量走本机带宽。

  • 400: 请求格式错误 | 500: 保存失败

3.3 自动扫描

GET/PUT /api/v1/settings/auto-scan

json
{"enabled": false, "interval_seconds": 3600}

默认关闭,间隔 3600 秒(1 小时)。PUT 校验 interval_seconds 范围 [60, 86400],更新后立即生效无需重启。

  • PUT 副作用: 异步触发 onAutoScanChanged(重启自动扫描调度器)
  • 400: interval_seconds 超出范围 | 500: 保存失败

3.4 扫描标题来源

GET/PUT /api/v1/settings/scan-title-source -- {"title_source": "tag"}

说明
tag优先使用音频标签中的标题(默认)
filename始终使用文件名(不含扩展名)作为标题

切换后需以"重新导入"模式扫描才能生效。

  • PUT 副作用: 异步触发 Scanner 重建
  • 400: title_source 不是 tagfilename

3.5 扫描自动创建歌单

GET/PUT /api/v1/settings/scan-auto-create-playlists -- {"enabled": true}

默认启用。启用后扫描完成根据音乐目录结构自动创建歌单;关闭则仅入库歌曲不建歌单。

3.6 扫描歌单归并模式

GET/PUT /api/v1/settings/scan-playlist-mode -- {"mode": "directory"}

控制扫描后自动创建歌单时的目录归并模式,默认 directory

说明
directory每个文件夹生成独立歌单(默认)
top_level按一级子目录合并歌单
bubble_up歌曲同时出现在所有上级文件夹歌单
  • 400: mode 值非法(仅接受 directory / top_level / bubble_up)| 500: 保存失败

3.7 日志等级

GET/PUT /api/v1/settings/log-level -- {"level": "info"}

可选值:debug / info / warn / error,默认 info。PUT 通过共享的 slog.LevelVar 即时切换运行时日志等级,同时持久化到 DB,重启后自动恢复。

  • 400: 等级值非法(仅接受上述四个枚举值)
  • 500: 保存失败

3.8 插件订阅源

GET /api/v1/settings/plugin-registries -- 获取订阅源列表(未配置时返回内置默认源)。

PUT /api/v1/settings/plugin-registries -- 保存订阅源列表。

json
{
  "registries": [
    {"url": "https://example.com/registry.json", "name": "官方插件源", "enabled": true}
  ]
}

每项包含:url(注册表 JSON URL)、name(名称)、enabled(是否启用)。

  • 400: 请求格式错误 | 500: 保存失败

3.9 HTTP 代理

GET/PUT /api/v1/settings/http-proxy -- {"proxy": ""}

默认空字符串(直连)。设置后所有后端外发 HTTP 请求通过代理转发,包括:插件注册表拉取、插件下载/更新、系统升级检查/下载。支持 HTTP/HTTPS/SOCKS5 协议。loopback 地址自动跳过代理。

  • 典型值:http://192.168.1.1:7890
  • PUT 副作用: 调用 httputil.SetGlobalProxy 即时更新全局共享 *http.Transport
  • 400: 代理地址格式无效 | 500: 保存失败

3.10 底部导航栏 Tab 配置

GET /api/v1/settings/tab-config -- 获取 Tab 配置(未配置时返回默认值:4 Tab)。

PUT /api/v1/settings/tab-config -- 保存 Tab 配置。

json
{
  "show_library": true,
  "show_playlists": true,
  "plugin_tabs": [
    {"plugin_id": 1, "entry_path": "myplugin", "name": "我的插件"}
  ]
}
字段类型默认值说明
show_librarybooltrue是否显示歌曲库 Tab
show_playlistsbooltrue是否显示歌单 Tab
plugin_tabsarray[]插件 Tab 列表

首页和设置固定显示(不在配置中),可选项为歌曲库、歌单和插件 Tab。

PUT 校验规则:

  • 可选项总数(show_library + show_playlists 各算 1 + 插件 Tab 数量)不超过 3,加上固定的首页和设置共 5 个
  • 每个插件 Tab 的 entry_pathname 不能为空
  • entry_path 不能重复
  • 400: 校验失败 | 500: 保存失败

3.11 网络歌曲标题来源

GET/PUT /api/v1/settings/remote-title-source -- {"title_source": "filename"}(归属 SongHandler

控制元数据刷新时网络歌曲标题的来源,默认 filename

说明
tag元数据刷新时用音频标签中的标题覆盖
filename保持文件名作为标题,不覆盖(默认)
  • 400: title_source 不是 tagfilename | 500: 保存失败

3.12 GitHub 更新代理

GET/PUT /api/v1/settings/github-proxy -- {"proxy": ""}(归属 UpgradeHandler

检查更新 / 升级时使用的 GitHub 代理前缀(如 https://ghfast.top/)。默认空字符串(直连)。仅持久化,不影响其它模块的全局 HTTP 代理(见 3.9)。

  • 400: 请求格式错误 | 500: 保存失败

3.13 插件常驻白名单

GET/PUT /api/v1/settings/plugin-keep-alive -- {"plugins": []}(归属 JSPluginHandler

不会被自动休眠的插件 entryPath 列表。白名单中的插件即使空闲超过 10 分钟也不会被卸载。未配置时返回空列表,保存后即时生效。

  • 400: 请求格式错误 | 500: 保存失败

3.14 插件自动更新

GET/PUT /api/v1/settings/plugin-auto-update -- {"enabled": false}(归属 JSPluginHandler

「后台自动更新已安装插件」开关,默认关闭。开启后服务会在启动后延迟数分钟检查一次、之后每 6 小时定时对有远程更新源的插件执行「检查更新 + 下载安装 + 热重载」。开关即时生效,无需重启。

  • 400: 请求格式错误 | 500: 保存失败

3.15 曲库浏览视图

GET/PUT /api/v1/settings/library-browse -- 曲库统一浏览页的视图显示与顺序(归属 ConfigHandler)。

json
{
  "views": [
    {"key": "all", "visible": true},
    {"key": "artist", "visible": true}
  ]
}

共 14 个视图 key,分三组:

  • 歌曲组all(全部) / local(本地) / remote(网络) / radio(电台)
  • 分类组artist(歌手) / album(专辑) / genre(流派) / year(年份) / decade(年代) / language(语种) / style(风格)
  • 歌单组playlist(全部歌单) / playlist_normal(普通歌单) / playlist_radio(电台歌单)

未配置时返回默认(全部可见、默认顺序)。返回始终包含完整 14 项:非法 key 被剔除,缺失 key 按默认顺序补到末尾(visible=true)。

  • 400: 非法或重复的视图 key | 500: 保存失败

3.16 用户偏好设置

GET/PUT /api/v1/settings/user-preferences -- 跨设备同步的用户偏好(归属 ConfigHandler)。

json
{
  "theme_mode": "system",
  "play_mode": "order",
  "playlist_view_mode": "grid",
  "audio_quality": "original",
  "local_cache_max_size": 1073741824,
  "volume": 50.0
}
字段类型默认值说明
theme_modestring"system"主题模式
play_modestring"order"播放模式
playlist_view_modestring"grid"歌单视图模式
audio_qualitystring"original"音质
local_cache_max_sizeint641073741824本地缓存上限(字节,默认 1GB)
volumefloat50.0音量

客户端登录后拉取、修改偏好时推送,实现多设备间偏好同步。未配置时返回默认值。

  • 400: 请求格式错误 | 500: 保存失败

3.17 均衡器

GET/PUT /api/v1/settings/equalizer -- 全局均衡器(EQ)配置(归属 ConfigHandler)。

json
{
  "enabled": false,
  "preset": "flat",
  "bands": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}
字段类型默认值说明
enabledboolfalse是否启用
presetstring"flat"预设名称(flat / rock / pop / jazz / classical / bass_boost / treble_boost / vocal / custom
bandsfloat[]全 010 段频段增益(31Hz–16kHz,单位 dB,范围 -12 ~ +12)

未配置时返回默认值(关闭 + flat 预设 + 全 0)。

  • 400: bands 不是 10 个元素 / 某段超出 -12 ~ +12 范围 | 500: 保存失败