你是马勒吗?这听起来像是马勒

2020-11-08 18:52:18

作为一名软件工程师和硬件修补工,最令人愉快的部分之一就是有能力解决我自己的特定(通常是小众的)问题。在这篇文章中,我要解决的特别问题是,我需要知道纽约经典广播电台WQXR目前正在播放什么。

对我来说,一个典型的星期六是这样的:我醒来,煮了一杯咖啡,端到客厅的沙发上,拿起我的针织品,打开收音机。也许到了早上一半,一件熟悉的作品出现了,但我把手机落在了另一个房间,如果不把自己从编织中解脱出来,错过一小部分吸引我注意力的作品,我就无法去查看WQXR的网站。

或者工作日怎么样:我正在做一个项目,深陷代码之中,WQXR实况流在我的一个百万浏览器选项卡中打开。我感觉到了一丝认可,但我完全专注于我的工作,不想打破我的注意力去追查直播播放器,找出它是什么。

要解决这个特殊的问题,我需要两样东西:一种找出收音机里有什么的方法,以及一个展示它的地方。

你可以通过几种不同的方式知道正在播放什么,包括像Shazam这样的音乐识别服务。但这些音乐依赖于他们的数据库中已经有了匹配的录音,我正在听古典音乐,在那里我可以听到任何给定作品的数十种不同录音(甚至是现场表演)中的任何一种,这使得这样的服务不太可能找到匹配的音乐。所以我从我已经用来获取这些信息的来源开始:WQXR网站。

如果你让网站打开足够长的时间,你会注意到它会自动更新以反映当前正在播放的内容。这对我来说是个好消息,因为这意味着在页面的某个地方,脚本会定期发出获取信息的请求,我也可以自己发出请求。为了找出这些请求是什么,我使用开发人员控制台窃听了浏览器的网络呼叫。

这里有两个调用,一个是对一个名为Streams的端点的调用,另一个是对一个非常令人满意的名为Whats_on的调用。向第二个端点发出请求后,我们得到了一个漂亮的json响应,其中包含有关纽约公共广播电台(New York Public Radio)各种直播流正在播放的内容的信息。太好了!这正是我要满足这个项目第一部分的需要。

(老实说,我不记得我是如何想到这一点的,但您可以将感兴趣的特定电台的呼叫信附加到URI中,以便只获取该流的信息,但完整的响应也可以很好地工作。)

好的,酷,我有数据了。当我在听收音机的时候,我怎样才能在麦麦鲍尔斯面前得到这些信息呢?

你已经从帖子顶部的预告片中知道了,我最终把它放在了壁炉架上,但我采取了一种迭代的方法来实现这一点。

我使用tmux来管理我的终端会话,我突然想到,状态栏总是在我的终端底部,它可能是一个了解当前正在播放的内容的好地方。我编写了一些轻量级的python类来获取和解析收音机的API响应,并编写了一个小脚本tmux.py,它以我想要的格式输出信息。

向tmux状态栏添加一些内容只需向.tmux.conf添加几行代码:

这会覆盖默认存在的时钟,所以我又添加了一个。默认情况下,在.tmux.com中运行的脚本每15秒执行一次,这对于我的目的来说已经足够快了。然后,我的状态栏如下所示:

这解决了我不想离开终端去看我在听什么的问题,但是当我在起居室的时候呢?我知道我想要一个显示屏,我想让它像tmux状态栏一样自动更新,我想让它像室内温度计读数一样不停地运行,我想它可以从房间的任何位置读取,具有良好的视角和在各种照明条件下的可读性。在我看来,这一切都像是使用电子报的完美借口。

皮莫罗尼正在打折,所以我拿起了两个电子墨水显示屏:较小的墨水HAT和较长的墨水HAT。我还买了几台覆盆子Pi Zero W手机(顺便说一句:这些手机售价10美元,有WiFi和蓝牙功能,哇)。

从inkypHAT和我已经编写的处理无线电数据的代码开始,我制作了我的想法的原型,在我的显示器上创建了一个微型显示器。我设置Pi Zeroes的方式就像我用Raspbian Lite设置我的更大的覆盆子Pi 3一样。我没有过多地担心如何在美学上设计显示器的样式,我学会了如何使用Inky和Pillow库,并编写了一个脚本来切割作曲家和标题,以适应屏幕上的多行:

我让它在处理器上每分钟运行一次,为了避免不必要地刷新电子墨水显示屏,我将写入显示屏的最后一件东西保存在内存中,只有在我从WQXR得到新的东西时才会更新。

为更大的inkywHAT显示修改这个脚本并不困难;它主要涉及调整字体大小以利用更大的屏幕。但由于这是为了放在我的壁炉架上,而且在我的起居室里很容易看到,我想让它看起来比仅仅把文字扔在上面要好看一点。我找到了一个剪贴画卷轴框架,只用了MacOS Preview app和ImageMagick,就把它弄成了适合电子墨水显示的大小和格式。

在Preview中,我抓住相框的一角,再次粘贴三次,每次旋转90度,仔细地在每个角周围颠簸,直到它们排成一排,可以合理地缩小到合适的尺寸(400x300px)。尽管这张照片看起来完全是黑白的,但仔细一看就会发现这根本不是真的!它实际上充满了许多不同深浅的灰色:

为了将图像转换为正确的格式并将其展平为两种颜色,我使用了ImageMagick命令行工具。虽然IM文档中这一极其详尽的页面深入介绍了将图像转换为黑白的各种方法,但我最终还是总结了以下几点:

当你在相对较高分辨率的显示器上看到它时,它有点粗糙,但在400x300电子墨水显示屏上看起来很棒!在那之后,添加文本非常简单;以前只显示文本时,我实际上仍在使用Pillow创建一个尺寸正确的空图像,将文本绘制到该图像上:

最后一点清理工作包括让文本在框架中居中,并在我的脚本中设置边距,使换行符与其边缘保持一段舒适的距离。

我对这个项目的进展很满意;在我客厅里的任何地方,文本都清晰可辨,我周六早上的听力体验也得到了极大的改善。最终,它会得到定制的木制外壳,我敢肯定,这将是它自己的职位!你可以在该项目的repo on Github中随意挖掘,以更好地了解这一切是如何工作的。