SonicLens:让听歌记录成为你的数字资产,不应只是流媒体服务器上的冷数据 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
vincentchyu
V2EX    分享创造

SonicLens:让听歌记录成为你的数字资产,不应只是流媒体服务器上的冷数据

  •  
  •   vincentchyu 3 月 7 日 1180 次点击

    你的听歌历史,不应只是流媒体服务器上的冷数据

    大家好,作为一名 macOS 深度乐迷,我一直觉得:音乐不仅是流动的空气,更是我们生命中不曾停歇的数字资产。

    然而,目前的流媒体平台( Apple Music, Tidal, Qobuz 等)往往将我们的听歌记录封锁在各自的围墙内。如果你使用 AudirvanaRoon 追求极致音质,这些宝贵的聆听痕迹更是难以被统一记录和深度挖掘。

    于是,我用 Go 编写了 SonicLens (音眸)


    什么是 SonicLens ?

    SonicLens 是一架专为 macOS 用户打造的“声之透镜”。它静默地守候在播放器之后,通过高频采样与无感监控,将你的每一次聆听凝结为属于你个人的、跨平台的音眸轨迹

    GitHub: https://github.com/vincentchyu/sonic-lens


    核心亮点

    • 数据资产化: 所有播放数据通过 SQLite 、MySQL 存储在本地,彻底摆脱平台限制,你的数据你做主。
    • 多平台无感监控: 基于 Go 并发特性,完美支持 AudirvanaRoon 以及 Apple Music 的实时状态采集。
    • 音眸智能洞察 (Sonic Insight): 接入 AI 大模型( Gemini/Ollama 等),对歌词进行深度情感与语义解析,帮你从文字维度重新认识每一首歌,尤其是小语种。
    • 实时交互仪表板: 采用 WebSocket 架构,秒级同步播放状态(比特率、封面、进度等),UI 追求极致的设计感。
    • 一键分享印记: 生成带有封面的 AI 见解海报,让你的聆听瞬间充满仪式感。

    技术侧写

    作为一个程序员,我在实现过程中加入了一些好玩的细节:

    • 使用 Goroutines 为每个播放器开启独立监听。
    • 通过 AppleScript 实现对底层播放器的无感采样。
    • 遵循 Last.fm 协议实现 Scrobble 逻辑,并使用 Redis 进行状态预测加速。
    • 前端基于 SSE (Server-Sent Events) 实现 AI 解析结果的流式呈现。

    效果展示

    (附上 README 中的几张截图)

    项目展示 AI 解析展示 1 AI 解析展示 2 播放展示


    结语

    这个项目是我对“科技与人文”结合的一次尝试。如果你也是对音质有追求、对数据有执念的 macOS 用户,欢迎试用并提出你的建议!

    如果觉得还不错,也欢迎点个 Star 鼓励一下。

    再次感谢大家的时间。


    GitHub 地址:https://github.com/vincentchyu/sonic-lens


    小红书可以搜索 #Soniclens #音眸轨迹 词条

    第 1 条附言    3 月 10 日
    # 专辑管理与 MusicBrainz 深度集成特性清单

    ## 概述
    实现了完整的专辑( Album )生命周期管理,并深度集成 MusicBrainz (MB) 能力,支持专辑元数据的精准补全、曲目轨道号自动校正及可视化详情展示。

    ## 变更详情

    ### 1. 数据库模型扩展
    - **Album**: 独立存储专辑信息(名称、艺术家、发行日期,流派)。
    - **TrackAlbum**: 维护歌曲与专辑的多对多关联,并记录每张专辑内的曲目序号(`track_number`)。
    - **ReleaseMB**: 缓存从 MusicBrainz API 搜索到的原始 Release JSON 数据。
    - **AlbumReleaseMB**: 记录用户手动确认的本地专辑与 MusicBrainz Release (MBID) 的关联关系。
    - **TrackPlayRecord**: 新增 `album_id` 字段,解决同名专辑区分问题。

    ### 2. 后端逻辑 (MusicBrainz Service)
    - **数据归集**: 实现了从现有记录中自动提取并生成专辑档案的初始化逻辑。
    - **初选补全**: 实现 `SearchAndCacheReleases`,支持根据专辑名/艺术家搜索 MB 候选发行版。
    - **精选维护 (深度维护)**: 实现 `DeepingMaintenance`。获取 MBID 详细元数据后,支持自动同步发行日期、确认曲目列表完整性,并强制校正本地记录的轨道序号。
    - **SaveReleaseMB 优化**: 改用 `(mbid, album_id)` 组合索引,解决同名专辑搜索重复问题。

    ### 3. API 与交互
    - **REST API**:
    - `GET /api/albums/:id`: 获取专辑详情及其所有曲目。
    - `GET /api/musicbrainz/search-releases/:album_id`: 触发 MB 搜索。
    - `POST /api/musicbrainz/deep-maintenance/:album_id`: 触发深度同步维护。
    - `POST /api/track-album/unlink`: 解除 TrackAlbum 关联(人工修复用)。
    - `GET /api/track`: 返回 Track 信息时增加 `album_id` 字段。
    - **前端增强**:
    - 在仪表盘热门专辑图表点击可直接弹出专辑详情模态框。
    - **样式重构**: 使用 CSS 变量统一亮色/暗色主题,修复之前硬编码颜色问题。
    - **操作按钮**: 详情页新增"初选补全"和"精选维护"交互按钮,打通 MB 同步链路。
    - **歌曲详情跳转**: 歌曲详情页的专辑名可点击跳转至专辑详情模态框。
    - **曲目管理**: 专辑详情中的曲目列表增加"解除"按钮,支持人工修复错误关联。

    ## 相关截图
    - ![专辑详情 1]( https://raw.githubusercontent.com/vincentchyu/sonic-lens/main/memory/2026-03-09/album_2026-03-10_18-40-26.png)
    - ![专辑详情 2]( https://raw.githubusercontent.com/vincentchyu/sonic-lens/main/memory/2026-03-09/album_2026-03-10_18-40-43.png)
    - ![专辑详情 3]( https://raw.githubusercontent.com/vincentchyu/sonic-lens/main/memory/2026-03-09/album_2026-03-10_18-41-26.png)
    - ![专辑详情 4]( https://raw.githubusercontent.com/vincentchyu/sonic-lens/main/memory/2026-03-09/album_2026-03-10_18-42-51.png)
    10 条回复    2026-03-30 16:51:40 +08:00
    astrodaw
        1
    astrodaw  
       3 月 7 日 via Android
    很早就有这个想法,一直没有行动。
    感谢开发者。即刻用起来
    Aaron01
        2
    Aaron01  
       3 月 7 日 via iPhone
    很有意思
    vincentchyu
        3
    vincentchyu  
    OP
       3 月 7 日
    @Aaron01 感谢
    vincentchyu
        4
    vincentchyu  
    OP
       3 月 7 日
    @astrodaw 因为用的平台很多,最致命的是当因为某个音乐平台恶性竞争而弃用时发现歌单听歌数据全部不能导出。当 Apple Music 要换区,几年的歌单数据,收藏没法做新账号的自动迁移,太痛了。每年出榜单还要等各个官方出歌单 top 统计,还有就是听了好多年的小语种的某些资源,解析后突然发现原来歌词讲的是这个太惊艳了。
    aero99
        5
    aero99  
       3 月 8 日
    项目挺有意思,可是听歌大部分时间是用手机
    Siefy1024
        6
    Siefy1024  
       3 月 9 日 via iPhone
    @aero99 #5 +1
    vincentchyu
        7
    vincentchyu  
    OP
       3 月 9 日
    @aero99 哈哈后面会有用音箱的时候,手机耳机的质量 后面会做提升的
    linuslv
        8
    linuslv  
       3 月 17 日
    以前有个 Last.FM ,在各大平台记录,但也一直无法覆盖所有端。
    非常支持您的项目,希望越做越好,目前手机、数播( NAS 里本地音乐+流媒体 TIDAl/网易云/Apple Music )比较多,macos 上几乎不会播放
    vincentchyu
        9
    vincentchyu  
    OP
       3 月 29 日
    @linuslv 是的,我这个也在同步 lastfm ,两份数据本地数据库、和 lastfm 各一份,我是基本上用 mac 当做数字转盘,基本上不在手机上听,出去是 mp3 但是不能同步。
    linuslv
        10
    linuslv  
       3 月 30 日
    @vincentchyu #9 手机装 last.fm 可以记录 mp3 的,但这是我 15 年前的配置,现在真的懒得用了,哈哈哈
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1146 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 23:14 PVG 07:14 LAX 16:14 JFK 19:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86