teulda v0.2.0
Windows 10 / 11

它不播放任何音乐。
只负责显示。

teulda 不是音乐播放器。它不打开文件,也不解码。它把 Windows 正在播放的东西 —— 网易云、YouTube 或游戏配乐 —— 放回二十年前的那个窗口,按钮照样能用。

免安装运行 · 无需管理员权限 · 直接用你现有的 .wsz 皮肤

上图是为说明布局而画的示意。真实窗口长什么样,由 你选的皮肤 决定 —— teulda 不附带任何皮肤素材。

指示灯 + 遥控器

这不是让你再装一个播放器

在你原本听歌的地方继续听。teulda 会把声音从任何来源接住,汇到同一个窗口。

SMTC 01 → 03

在你原本听歌的地方继续听。teulda 会把声音从任何来源接住,汇到同一个窗口。

01

播放仍由你的应用负责

Spotify、韩国各家 PC 客户端(Melon · Genie · Bugs · FLO)、Chrome 与 Edge 里的 YouTube,乃至游戏启动器的背景音乐。账号和 DRM 依旧归它们管,teulda 从不插手。

02

Windows 本来就知道

Windows 会把正在播放的内容登记到一个叫 SMTC 的窗口。键盘上的播放、暂停键之所以在任何应用里都管用,就是因为它。

03

teulda 去读那个窗口

取出曲名、艺人、播放进度和封面画到皮肤窗口里;你按窗口上的按钮,它再原路传回那个应用。

实测,不是猜的

韩国四大音乐客户端,全部可用

这是整个产品的前提。如果 PC 客户端不向 Windows 登记,用户看到的就是一个空窗口。所以我们没有猜,而是在每个应用里真放了一首歌来测。

播放来源 曲名 进度 · 时长 可接受的操作
Melon · Genie · Bugs · FLO PC 客户端 能拿到 能拿到 播放 · 暂停 · 拖动
YouTube Music · Spotify 网页版 —— 使用 Media Session 的网站 曲名 准确 播放 · 暂停 · 上一首 · 下一首 · 拖动
浏览器 —— 只用 <audio> 的网站 页面标题 准确 播放 · 暂停 · 拖动

2026 年 9 月 14 日在真实 Windows 电脑上用发布版本实测。可用操作因应用而异 —— 应用没登记的按钮在 teulda 里同样是灰的。有些应用根本不发送艺人名,那就只显示曲名。

.wsz

二十年份的皮肤,早已做好了

经典 Winamp 皮肤留存下来的超过十万个。teulda 直接读那些 .wsz 文件 —— 不转换,也不重画。

版权

我们不附带皮肤

每一个都属于画它的人。读懂一种文件格式,和把别人的画塞进自己的安装包里,是两码事。

容错

不守规格的皮肤照样画得出来

进度条做成 307×5 而不是 307×10 的皮肤;字体图在文件中途被截断的皮肤;region.txt 语法完全随意的皮肤。teulda 有多少画多少,只丢掉读不出来的那一块。

四个窗口

主窗口 · 均衡器 · 播放列表 · 专辑封面

封面窗口在经典版里并不存在,所以用 A 键打开。它的边框不是新画的,而是用那套皮肤自己的播放列表切片拼出来的 —— 不管你换哪套皮肤,它看起来都像那套皮肤自带的窗口。

一如当年

双倍大小 · 折叠模式 · 频谱

频谱条和示波器不是动画。它们画的是真正从你音箱里出来的声音。

文字消失的问题

你的文字能显示出来

经典皮肤里的字体图只有 ASCII。所以照原样显示时,中文、韩文、日文、西里尔字母的曲名会整块消失。

直接用皮肤字体
(feat.HAEMOO)/(DIVEP

偏偏是你最想看的曲名和艺人不见了。十万个皮肤里绝大多数只带 ASCII,所以换皮肤根本解决不了。

teulda
이 길 (feat. HAEMOO) / 디브퍼(DIVEPER)

只要有一个字画不出来,那一整行就改用系统字体叠上去。纯 ASCII 的曲名仍旧用皮肤自带的字体 —— 那才是这个窗口该有的样子。

曲名栏原本只有 6 像素高。teulda 只借用每套皮肤在它上下真正空着的那几行(背景是照片的皮肤一行也借不到),文字按窗口倍率以实际大小绘制。字色则通过测量该栏背景亮度来决定。

新加入的

不再错过刚刚溜走的那首歌

Spotify 永远不会知道你在 YouTube 上听了什么。teulda 两边都看得见 —— 在任何地方按 Ctrl+Alt+S,此刻正在播的这首就会在这台电脑上留下一行。

S

哪怕窗口不在前面

你真正错过的,是 打游戏或写东西时 溜走的那首。Ctrl+Alt+S 不管你在哪、在干什么都管用。要是这个组合已经被别的程序占了,它会往下找一个没被占的,并 把实际拿到的键写在收藏窗口里

自动

听完一整首,它自己就留下了

不用按键。但 只有亲眼看着它走到结尾才算 —— 歌快放完时才打开窗口,不等于你听过它。会和你亲手挑的分开标记。

L

在收藏里查看,也能带走

查看收集到的内容、删掉某一行、导出为 CSV —— 保存成 Excel 打开时不会乱码的格式。也可以整份复制,粘到任何地方。

只在这台电脑里

根本没有出去的路

你在何时听了什么,属于个人信息。处理这份记录的代码里 没有任何一行碰网络,而且有测试守着这一点。导出只在你按下按钮时才会发生。

“来源”一栏的应用名是 大家一起补的。 Windows 交出来的是 neowizinternet.234211C5E0 这样的值,不是给人看的名字。知道哪个值对应哪个应用的,只有用那个应用的人,所以这张表放在仓库里,表上没有的值就原样显示。猜出来的名字更糟 —— 看自己记录的人根本无从察觉它是错的。

앱 이름 알려주기

先说在前面

做不到的,和故意不做的

下载之前该知道的事,免得下完失望。藏着不说,最后也会变成 bug 报告回来。

均衡器不会改变声音

我们根本拿不到音频流,没有地方挂滤波器。滑块依然会动,是因为 看看这套皮肤把均衡器窗口画成什么样 才是这个窗口存在的意义。

播放列表看的是过去,不是将来

Windows 那个窗口只交给我们一样东西:此刻正在播的这首。没有队列,也没有播放列表。所以那个窗口是 已经播过的曲目记录,点某一行也不会跳过去。

kbps 那一格留空

我们不解码文件,无从得知它的编码码率。在同一格里填一个意思不同的数字,那就是撒谎。 kHz 和单声道/立体声取的是输出设备的值。

最小化按钮没有接线

这个窗口不在任务栏上,一旦最小化就没办法再叫回来。一个按了没反应的按钮,好过一个按了就让程序消失的按钮。

音量滑块调的是系统音量

那个窗口既不报告音量也不接受音量,所以经典滑块调的是 Windows 的主音量。左右平衡只做显示,不会真的生效。

仅限 Windows

它直接调用 Windows 的媒体窗口。macOS 和 Linux 没有这个窗口,移植过去也只会得到一个空窗。
接下来要做的

现在是指示灯,接下来是收听记录

收集这件事已经能做了。接下来是 怎么读这些记录,以及跨服务认出同一首歌。

正在做

认出同一首歌

那个窗口不提供曲目 ID。所以第一件事是把 Song (feat. X)Song (Feat. X)Song (2024 Remaster) 归成同一首 —— 这里错了,下面所有数字都会悄悄跟着错。

正在做

把过往的记录搬进来

读取 Last.fm 或 Spotify 给你的导出文件,把过去吸收进来。从空收藏起步,和从装着十年记录的收藏起步,是两个不同的产品。

之后

一个能看记录的界面

各服务的占比、按时段的收听,以及 你听完的歌和三十秒内就跳过的歌 —— 这个数字没有一家服务会给你看。

之后

发送到 Last.fm · ListenBrainz

如果你本来就有 scrobble 记录,就往那边送。用你的账号,而且只在你打开它的时候。

之后

给直播用的字幕源

它会持续把当前曲目写进一个文本文件。让 OBS 指向它就行了。

再往后

做皮肤

存世的有十万个,可是 新做一个的路已经堵了二十年。 我们手里有完整的坐标表,所以能做出编辑器。

记录只留在这台电脑里。 你在何时听了什么,属于个人信息。任何会离开这台机器的东西都得你亲手打开;不打开,它哪儿也不去。

v0.2.0

解压,运行,就这样

不需要安装程序,也不需要管理员权限。把 .wsz 文件拖到窗口上就能换皮肤。

  1. 1

    把下载的 zip 解压,运行 teulda.exe。不用安装程序,也不用管理员权限。

  2. 2

    Winamp Skin Museum在新窗口打开。挑一个喜欢的,按 Download skin,就会得到一个 .wsz 文件。

  3. 3

    把那个 .wsz 拖到 teulda 窗口上。这就是安装 —— 不用解压,也不用放进哪个文件夹。

你会拿到
teulda-0.2.0-win64.zip下载约 35 MB,解压后 81 MB · 无需另装运行库
运行环境
Windows 10 / 1164 位
你需要准备
一个 .wsz 皮肤要是没有,Winamp Skin Museum 里有十万个
操作
S 收藏 · L 收藏夹任何地方 Ctrl+Alt+S · D 双倍 · W 折叠 · A 封面 · Esc 关闭
已签名,但 Windows 可能还会问一次。 这个版本以 PROJECTTEAMFORYOU 的名义签名,并带时间戳。不过标准证书本身不附带信誉 —— 在下载量积累起来之前,SmartScreen 仍可能弹出“Windows 已保护你的电脑”。遇到时请点 更多信息 → 仍要运行。发布页列出了 SHA-256,你可以据此核对文件是否就是我们构建的那个。

如果什么都没在播,窗口是空的才是对的。去放点什么吧。