前言
本文将追踪歌单分类项目开发的心路历程,展示我是如何将一个灵感具体落实成项目的。同时也会展示我在此过程中养成的习惯。
正文
原谅我再一次开了新坑。
本次项目的灵感是听歌的时候出现的。每当我在巨大的、将近三千首歌的歌单里面随机播放,却总是不如意,听不到想听的风格。我曾经试图去手动分类,听到哪首歌就将它放进某一小歌单中,但效率实在过低。在我接触了项目开发后,我重新审视这个问题:为什么我不写一个小脚本来分类呢?万一其他人需要呢?
我首先查了一下是否有人做过类似的项目。好吧在我撰写这篇blog的时候我貌似看到了一个类似的skill项目,但是在用户友好这一方面或许不如我?我这个项目只需要运行两个bat就好了((看上去赛道很宽还没啥人。
然后我开始了我的设计。接下来我会以时间顺序叙述。
2026-06-02:标签墙交互定型
我最初的想法是:音乐平台既然有日推,就必定是根据用户的喜好来推荐的,那么就一定存在歌的标签,也就可以自己分类、设计自定义风格的歌单了。
于是我进一步了解了网易云音乐(因为我自己用的是网易云)的推送逻辑。网易云的逻辑是五个维度(语种等),然后还有细分多个类目。我觉得这个地方很不错,并且我吸收了“相似歌单”的办法,交叉验证。
在筛选方面,我第一时间想到的是标签墙,后来演变为类词云的办法(面向操作的可点击的筛选面板)。raw_tags 被单独拆成一块,因为原始标签噪声大,但它们往往最贴近用户想筛的语义。language、final_genre、final_subgenre、mood、scene、theme 被设计成独立维度。同一维度内多选使用 OR。不同维度之间使用 AND。初始状态不选任何标签,也不显示命中歌曲。命中歌曲默认全选,但结果表保留逐首取消。
后续我又加入了 raw_tags 的收紧规则:当 raw_tags 选到 3 个及以上时,不再让结果变成宽松 OR,而是要求歌曲至少命中多个已选原始标签。
但这个收紧仍然过于宽松,直到撰稿时我仍未解决这个难题。
2026-06-02:配置边界和 README 同步
这一天我继续把项目配置边界理顺。
上次的账单项目我吸取了教训,非敏感默认值迁移到 config.toml,只有敏感的cookie等内容我放在.env。Streamlit 自己的运行和界面默认值保留在 .streamlit/config.toml。
2026-06-03 到 2026-06-04:摸索
这段时间我主要研究了打包编译的可行性。考虑到后续的开发仍任重道远,打包为exe也许为时过早,所以我放弃了此想法。
同时这段时间网易云早期版本已经跑通,邀请了几个朋友测试,结果发现几个问题:npm指令在某些环境用不了,于是我加入了初始化bat作为救急。
一个重要约束:Windows 启动脚本要少做复杂嵌套命令,尽量把逻辑拆成清晰标签和普通参数。
2026-06-05:本地网易云 API 运行时稳定化
抓取歌单内歌的标签的时候,api经常断,但是又没有重新启动。
于是我收敛了启动路径:init_netease_api.bat 负责一次性准备本地 NeteaseCloudMusicApi 运行时。运行时安装到 .cache/netease_api_runtime。backend/run_netease_api.js 成为仓库自己的启动包装器。这个包装器加载第三方包里的 generateConfig.js 和 server.js,并关闭版本检查。
run_spectra.bat 负责日常启动,并能探测 18631 上是否已有健康 API。如果已有健康 API,就复用它,而不是再启动一个导致 EADDRINUSE。
2026-06-05:抓取断点持久化
我当时后台挂着抓取在打游戏,等我打完游戏回头一看:界面刷新了,我等了半天还得重新跑。我于是意识到了进度丢失的痛。
原始标签抓取以前主要依赖 st.session_state,页面刷新或进程重启后,队列、游标、部分抓取结果都可能丢失。
data/extract_checkpoint.json 保存队列、结果行、游标、总数、运行状态、暂停状态、完成状态、最后错误、当前歌单信息和 source signature;data/processed.json 继续作为最终归一化结果存储;恢复时要求 source signature 匹配,避免把旧歌单断点错套到新歌单。
这都使得大歌单抓取可以中断后恢复。
阶段性总结、延申
在项目的摸索中,我对写项目的理解进一步加深了。项目不是一朝一夕就完成的,而是在大框架打好后,一点一点和agent对接,反复磨合,不断迭代而产生的。
我越来越认为新时代程序员不是消失,而是会有更多广义程序员。作为驾驭agent的人,程序员无疑有更多相关知识,这一定是和代码朝夕相处的来的,是在计算机领域实践得到的,这是那些希望几句话就让ai做一个大项目的人无法企及的。一个项目肯定是不断在测试中进步的,在测试中,我们不断发现问题,不断查缺补漏,让项目趋近我们心中的样子。
日常生活也是如此。如果要掌握某项技能,就一定要耐下心思去练习,不要心浮气躁,沉得住气,不断发现自己的问题,不断迭代自己的本领,才能达到自我进步的目标。
无限进步。共勉。
26/06/09夜

