Xiao-no-love 5d5d5cce19 v2.2+v2.3: 前端增强与 UI 去 AI 味重构
v2.2 前端增强:
- 站内 HLS 收听页 (#pageLive),hls.js 本地化 vendor/hls.min.js
- 设置页 (缓存/配置/日志)
- 上传进度百分比 (XHR upload.onprogress)
- 资源列表排序 (时间/热度/名称 ×升降)
- 面板正在播放实时化 (接 playlist-update/song-finished,删死监听)
- 死代码清理 + forgetSong 内存泄漏修复 + CORS 非法头移除
- start.cmd 托管启动脚本 (set "VAR=val" 避免尾部空格)

v2.3 UI 去 AI 味 (依据 ibelick/ui-skills baseline-ui):
- 频道管理+切换合并为单一入口 #btnStreamMgr.channel-btn
  (删除 header 的 #streamSelect 下拉,弹窗内统一切换/删除/新建)
- 清除全部 CSS 渐变与 glow: 橙红 #ff5f6d→#ffc371、紫 #8b5cf6、
  径向光晕、缓存条渐变 → 全部改为 accent/token 纯色
- live 区、modal 区硬编码色统一归 CSS 变量 token

测试: api 16/16, e2e 17/17, write 5/5 全绿
2026-09-24 21:55:23 +08:00

音乐在线电台 · v2

把 audio/ 目录里的歌曲用 FFmpeg 切成 HLS 切片,拼成多路永不停播的直播流,并提供 Web 控制面板管理播放列表、导入音源(网易云 / 本地上传)。前后端一体的 Node.js 应用。

v2 相比 v1 的变化

  • 数据库:JSON(playlist/heat/metadata)→ SQLite(better-sqlite3,WAL 模式),支持多路流隔离
  • 鉴权:可选 Bearer Token → Cookie 会话登录(面板 + API 全保护,HLS 流不锁)
  • 多路流:单流 → 多路独立直播流,各自播放列表,/hls/{streamId}/index.m3u8
  • 导入:仅网易云下载 → 增加本地上传导入(自动匹配作者/封面)
  • 删除:无 → 级联删除(音频 + 切片缓存 + DB + 播放列表引用)
  • 本地化:CDN 依赖 + 封面图 → 全部本地(public/vendor/、public/covers/),系统字体
  • 模块化:1233 行单文件 → src/ 分模块

环境要求

依赖 版本
Node.js >= 18
FFmpeg 含 ffmpeg 与 ffprobe,在 PATH 中

安装与启动

npm install
npm start

首次启动若未设密码,控制台会打印随机登录密码:

[AUTH] 未设置 PANEL_PASSWORD,已生成随机登录密码: xxxxxx

建议固定密码:

# Windows PowerShell
$env:PANEL_PASSWORD="你的密码"; npm start
# Windows CMD
set PANEL_PASSWORD=你的密码 && npm start
# Linux / macOS
PANEL_PASSWORD=你的密码 npm start

访问 http://127.0.0.1:3000,用密码登录。

目录结构

demo/
├── index.js              # 入口,委托 src/server.js
├── src/
│   ├── server.js         # 主程序:装配路由、启动服务
│   ├── config.js         # 配置(环境变量)
│   ├── logger.js         # 日志(分级 + 落盘 + 面板可查)
│   ├── db.js             # SQLite 初始化 + schema
│   ├── store.js          # 数据访问层(全部 SQL 收敛于此)
│   ├── util.js           # 工具函数
│   ├── media.js          # ffprobe / FFmpeg 切片 / 并发队列
│   ├── metadata.js       # 网易云 API / 封面本地化 / 元数据补全
│   ├── livestream.js     # LiveStream 类 + 多路流管理 + 缓存
│   ├── scanner.js        # audio/ 目录监听与同步
│   ├── auth.js           # 会话鉴权
│   ├── sse.js            # SSE 推送
│   └── routes/           # API 路由(auth / music / resources / streams / system)
├── public/               # 前端(index.html / login.html / css / js / vendor / covers)
├── scripts/fetch_vendor.py  # 一次性下载前端 CDN 资源到本地
├── audio/                # 音频文件
├── data.db               # SQLite 数据库(自动生成)
└── hls/ hls_cache/       # 直播流与切片缓存(自动生成)

API 一览

所有 /api/*(除 /api/auth/*)需登录。

方法 路径 说明
POST /api/auth/login 登录(body: {password})
POST /api/auth/logout 登出
GET /api/resources 资源列表
GET /api/music/search?keyword= 网易云搜索
POST /api/music/detail 网易云详情
POST /api/music/download 网易云下载入库
POST /api/music/import 本地上传导入(multipart)
POST /api/music/delete 删除音频(级联)
POST /api/music/delete-batch 批量删除
POST /api/music/enrich 重新匹配元数据
GET /api/streams 流列表
POST /api/streams 创建流
DELETE /api/streams/:id 删除流
POST /api/streams/:id/start|stop 启停流
GET /api/streams/:id/playlist 播放列表
POST /api/streams/:id/playlist/add|remove|reorder|clear|next|prev|jump 播放列表操作
GET /api/system/cache 缓存信息
POST /api/system/cache/cleanup 手动清理缓存
GET /api/system/logs?tail= 查看日志
GET /api/events SSE 实时推送

直播流地址

  • 默认流:http://127.0.0.1:3000/hls/main/index.m3u8
  • 其它流:http://127.0.0.1:3000/hls/{streamId}/index.m3u8

可用 VLC、PotPlayer、ffplay 打开。

环境变量

变量 默认 说明
PANEL_PASSWORD 随机 面板登录密码
PORT 3000 端口
HLS_TIME 5 切片时长(秒)
SLIDE_WINDOW 15 滑动窗口段数
MAX_CACHE_MB 1000 缓存上限
FFMPEG_CONCURRENCY 3 转码并发
SESSION_TTL_HOURS 72 登录有效期(小时)
LOG_LEVEL info 日志级别

技术栈

Node.js · Express · better-sqlite3 · Multer · Chokidar · FFmpeg(HLS)· SortableJS · Bootstrap Icons

S
Description
No description provided
Readme
292 KiB
0 Stars 1 Watchers 0 Forks
Languages
JavaScript 53.7%
CSS 28.7%
HTML 12.2%
Python 5%
Batchfile 0.4%