2026年7月18日
MusicShare 本地音乐共享
把电脑里的本地音乐库通过局域网分享给手机播放和下载,信令常驻、文件服务器按需启停。
#Python#FastAPI#SQLite#Tkinter#JWT#Android
电脑里存了一大堆本地音乐,想躺在床上用手机听,但又不想让电脑一直开着服务。
核心设计:双层服务
这是整个项目最关键的取舍。
| 层 | 端口 | 状态 | 职责 |
|---|---|---|---|
| 信令服务 | 19999 | 常驻 | 收手机心跳和下载请求,对外暴露主服务器在线状态 |
| 主文件服务器 | 8000 | 按需启动 | 真正提供歌曲文件、认证和版本下载,闲置 30 分钟自动关 |
只开一层不行:常驻会白占 CPU 和内存,关掉又没人接收手机的下载请求。分成两层之后,电脑大部分时间只跑一个轻量信令进程。
一次下载的完整链路是:手机插件发心跳和下载请求 → 电脑控制台弹通知 → 用户点批准 → 主服务器启动 → 手机端轮询到在线状态后开始下载 → 30 分钟无活动自动关闭。
做了什么
- 认证:SQLite + bcrypt + JWT,注册、登录、找回密码、会话校验都走同一套。
- 音乐扫描:遍历目录,用 mutagen 解析元数据,缓存进 SQLite(WAL 模式)。
- 局域网发现:mDNS 广播,手机不用手输电脑 IP。
- 版本分发:内置 APK 服务,支持版本比较、回滚和 sha256 校验。
- 桌面控制台:Tkinter 四个标签页(服务器 / 客户端 / 下载请求 / 版本更新),带二维码和系统托盘;后台线程全部通过
queue.Queue把事件投递给 UI 主线程,避免 Tkinter 多线程崩溃。 - 手机端:没有重写 App,复用 MusicFree 现成的播放器和下载器,只写了一个音乐源插件。
技术栈
Python + FastAPI + Uvicorn + SQLite + Tkinter,手机端是 MusicFree 插件(JavaScript)。
留下了什么
写了 7 篇从架构、环境搭建、核心模块到排错的项目教程,把双层架构的取舍和每一步的坑都留了下来。