首页 关于我 项目 博客 图谱 简历 联系 English
返回列表
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 篇从架构、环境搭建、核心模块到排错的项目教程,把双层架构的取舍和每一步的坑都留了下来。