基于家庭自动化的跨生态音乐播放系统

前段日子为了响应消费降级,就把自认为一直不怎么使用的 Apple Music 给退了。但不知怎么的,自从不能再用 Siri 直接让 HomePod Mini 放歌之后,想要在做咖啡或是洗澡的时候舒适地听歌这个念想突然就日渐强烈起来。 我本身并不是 HomePod 的忠实用户,家里也还有小米之类的其他 Wi-Fi 音箱,回去续订 Apple Music 本身并不能解决全部问题。因此眼下的需求便是以相对便捷的方式在 HomePod、小米音箱这些跨生态的设备上实现统一播放来自 Spotify 或是 Plex 等服务上的音乐。 Music Assistant Music Assistant 是一个能同时管理离线音乐和聚合在线音乐服务的音乐库管理工具,它可以轻松将音乐流式传输到各种支持的播放器,并与 Home Assistant 高度契合。不久前刚加入了对 Apple Music 的支持,目前已可以用其聚合非常多的音乐服务。 播放器支持方面则对 Airplay、DLNA、Sonos、Google Cast 等常见方案一应俱全。直接使用已经接入 Home Assistant 的播放器自然不在话下,用户还可以透过官方提供的桌面应用 Music Assistant Companion 将 PC 或者 Mac 的扬声器以 Squeezebox (Slimproto) 播放器的形式加入进去以实现更为同步的全屋音乐。 不同传输协议在 Music Assistant 中存在一定差别,对此官方也在文档中提供了很直观的对比图。 我目前所需要接入的 HomePod Mini 和 XiaoMi Sound 均有且仅支持 Airplay 的传输方式(为什么小米不提供 DLNA?),这里就直接省去思考直奔 Airplay 了。 ...

December 12, 2024 · Chock · Notes

Unraid 无法引导 qcow2 的解决办法

今天在给 Unraid 调整缓存池后,发现片刻前仍正常运行的 Home Assistant 在更改了虚拟磁盘的路径后无法正常启动了。 各种尝试无果后,爬帖子发现还需要在 xml 视图下稍作修改: <devices> <emulator>/usr/local/sbin/qemu</emulator> <disk type='file' device='disk'> - <driver name='qemu' type='raw' cache='writeback'/> + <driver name='qemu' type='qcow2' cache='writeback'/> <source file='/mnt/cache/domains/Home Assistant/haos_ova-10.5.qcow2' index='1'/> 修改后总算是顺利启动了. 应该是刚刚在 webui 中修改了 qcow2 的路径导致 UNRAID 错误得将 type='raw' 写到了 xml 里. 但我全然不记得以前也过这样的操作, 如果没有的话, 以前又是如何引导的呢? 带着这样的疑惑, 我重新开了一台新虚拟机, 选择 qcow2 后没有编辑 xml 直接创建后启动, 这次也成功了. 查看此机的 xml 发现 type='qcow2' 好端端得摆在那. 看起来是 UNRAID 只有在添加磁盘的时候才能对 qcow2 作出正确的配置了.

December 4, 2024 · Chock · Notes

通过 Home Assistant 切换罗技 Unifying 优联频道

自入手 MX Master 2S 起就对罗技的 Unifying 优联系列颇为钟爱,后来也把键盘换成了魔改 K375s 的 DIY 键盘。优联的 Flow 在双机双屏的情况下频道切换十分自如,但相较而言在双机共用一屏的时候因为手动切换频道的按键在鼠标底部就显得十分不便了。 此时购买带 KVM 的 HDMI 切换器使两台电脑共用一个接收器算是比较简单粗暴的办法,但因为听到不少关于此类切换器可能会在使用中遇到各种Bug迟迟没有下手。 于是我便想,有没有一种方法可以用命令来切换键鼠的频道,从而进一步设定调用规则来实现双机一屏的自动切换呢?想着想着我便找到了这个项目 marcelhoffs/input-switcher。经过 2 天的测试算是得到了一个相对满意的结果,特此记录一下。 准备工作 此脚本的原理大概是利用 hidapitester 直接向特定硬件 ID 的 USB 设备发送一串 16 进制的报文来实现频道切换。具体报文可以通过分析 Linux 下的罗技驱动程序 Solaar 进行推测,原 Repo 只提供了 MX Anywhere 和 MX Keys 的报文,在实际使用中发现并不能兼容我的 MX Master 2S 与 K375s,因此需要自行使用 Solaar 提取。 随便起一个 Ubuntu 虚拟机,桌面环境可以直接从自带的应用中心搜索安装 Solaar。 随后打开 Solaar,插上接收器,设备列表中已配对的设备会亮起,此时打开终端,先查询下MX Master 2S solaar -dd config "MX Master 2S" change-host 1 #任意其他频道,此处使用频道1 顺利的话会返回以下信息 logitech_receiver.base: (17) <= w[11 01 091A 01000000000000000000000000000000] 根据 marcelhoffs/input-switcher 的说明,可以确认 MX Master 2S 切换至频道 1 时所发送的报文对应到 hidapitester 的格式为 11,01,09,1A,01,00,00。其中 09 对应具体的设备型号,1A 是一个随机数,这里只需要记住这两个数值即可。 ...

March 15, 2023 · Chock · Notes

让 macOS 更好地合并同名文件夹

以往我在 Windows 下整理 NAS 上的文件时,遇到需要合并的同名文件夹时,只需要简单地把其中一个拖入到另一个文件夹所在的目录中。如若没有遇到同名文件冲突的情况,那么整个过程会在一瞬间完成,它时十分符合操作直觉的。 但在 macOS 下想要像这样合并两个文件夹却是意外地困难。 在 macOS 下,Finder 默认只为同名文件夹冲突提供了“停止”与“替换”两个选择,无须怀疑,这里的“替换”并没有字面之外意思。而在一番搜索后,不难会发现苹果设置了一个可以用 opt 键触发的隐藏的“合并”按钮。 但这个“合并”始终是以拷贝的形式进行的,这意味着每一次合并文件夹的时候 Finder 都会制造一次毫无意义的磁盘写入。而这份无意义的写入所造成的影响对于 NAS 用户来说,则会被传输协议、磁盘性能、网络带宽等因素进一步放大,最后从无意义进化成了一种折磨。 对此,如果不愿意选择那些更迎合 Windows 使用习惯的第三方文件管理器的话,使用跟 Finder 高度耦合的 Automator 来跑一个合并行为更接近 Windows 的脚本可以算是一个折中办法。 Automator 能够很方便得透过 Finder 获取所选文件的路径,同时它也能调用 Finder 的弹窗选择器来手动选择一个路径来作为变量使用。像是这样: 在运行工作流的时候,所有被选择的项目的路径都会依序作为列表值被输入,而在通过请求访达项目选择输出路径后,就得到了一个类似 ['-c', 'path1', 'path2', 'path3',...'pathN'] 的列表。起始项始终是固定的值 '-c',所以此处只需要截取第二项至倒数第二项作为 src,以及结尾项作为 dst 即可。 有了 src 和 dst ,事情就变得非常简单了,这里就用 Python 的 shutil 模块起一个脚本。 import sys,os,shutil src = sys.argv[1:-1] dst = sys.argv[-1] for item in src: for root,dirs,files in os.walk(item): for file in files: old = os.path.join(root,file) start = os.path.dirname(item.rstrip('/')) new = os.path.join(dst,os.path.relpath(old,start)) if not os.path.exists(os.path.dirname(new)): os.makedirs(os.path.dirname(new)) shutil.move(old,new) shutil.rmtree(item) 现在将脚本拖入工作流,传递输入选择“作为自变量”,再把脚本的输出作为文本导出一份,最后这个样子就大抵堪用了。 ...

September 9, 2022 · Chock · Notes

Plex 最后的波纹 —— Plexamp

今年四月,向来傲慢且怠惰的 Plex 一口气发布了 2 款手机 App,分别是用于监管后台信息的 Plex Dash 及音乐播放器 Plexamp。前者看起来是打算要取代 Tautulli,后者则其实在桌面系统上由来已久。 先不论仅仅支持移动端的 Plex Dash 是否真的能代替桌面移动两开花的 Tautulli,另外那个终于从桌面端滑向移动端的 Plexamp 则宛如重获新生。 如果你也使用或打算使用 Plex 管理音乐且正好购买了 Plex Pass 的话,那么 Plexamp 也许是一款能让你为之惊叹的音乐播放器。 关于 Plexamp Plexamp 是 Plex 在 2017 年推出的跨平台音乐客户端,最初仅支持 Windows 与 macOS。尽管它的名字一看就是在致敬 Winamp,但它并非是在 Winamp精神续作 这样的包袱下诞生的。它首先不是一款通用播放软件,PlexMediaServer 仍然是它正常运作的绝对前提,它的外观也与 Winamp 截然不同。 作为 Plex 的减法产物,剥去了一切与音乐不相关的元素后,在自己本地的收藏中聆听音乐这件事也确实变得纯粹起来。在全局热键系统的帮助下,你甚至可以像使用 Spotlight 那样激活 Plexamp 的搜索快速找到想听的音轨。 可惜的是每当我按下激活搜索框的热键,接下来听什么 这个问题却往往无法在这之后立刻得到答案。每每到此,我便陷入短暂的呆滞,旋即便沮丧着脸试图快速想起一个之前建立的歌单名,或者就干脆回到网页端去慢慢浏览。 而我每多使用一次 Plexamp,这种沮丧就每增加一分。 浏览是 Plexamp 的最大短板,最初的 Plexamp 并没有一个完整的媒体库界面,除了仅有几个 Recently 节点外绝大部分音乐需要靠搜索来访问。此外,在高分屏下摆弄一个大约只占显示器 1/32的软件无论如何都难以让我对它尚且无法实现的浏览体验有所期待。 鉴于本来在 app.plex.tv 上听歌也并没有什么不方便的,我很快就卸载并淡忘了它。 直到我在手机上与它再次见到了它…… ...

December 7, 2020 · Chock · Notes

关于跑步 🏃

今年从春季开始晨跑,到了六月无论如何也抵挡不住酷暑的日晒就消停了一阵子。夜跑是个不错的选择,但当时的我却无法支配夜间的时间。于是夜跑似乎便成了自由的象征,我渴望夜跑即正如我渴望自由。 九月的时候,工作时间终于恢复了正常。压制了数个月的跑步欲也同时迸发了出来。没多久我就因为过度运动导致的足底酸疼去到医院做了个检查,除了确诊不太意外的足底筋膜炎之外还知道了自己有足弓塌陷。幸运的是我仍能通过使用更适合平足的跑鞋或者鞋垫来继续跑步这件事,并且合理的足弓训练也可以进一步地缓解我的足底负担。 强行捡个不幸的事儿来说的话,那就是像我这种容易纠结的人多少还是会对此有所埋怨。我消沉了好几天,觉得这是自己作为人的缺陷。我并不为此感到自卑,但自信也仿佛因此凝固。 直到我再次脚踏实地地奔跑起来时,有种如同是来自灵魂深处的涌动很快就淌遍全身,像是身体的某个开关被打开,又觉得那才是自己本来该有的样子,大概那就是自我的本能对运动的渴望吧。那么,这点点不幸也就显得无关紧要了。

October 19, 2020 · Chock · Life

正式弃用 Wordpress

才不会说是因为没有备份Wordpress才被迫更换平台的呢。 ...

October 1, 2020 · Chock · Notes

再记一次春游

转眼又是一个四月,今年人数比去年多了不少,算上狗狗的话约有一倍之多。 人一旦多起来,就难免会自然而然地分裂成好几个小圈子,如此一来人数的变化就不再那么令人在意了。 为了不转而在意转眼又是一年这件事上,我尝试去在意一些别的东西,例如多喝水可以改善小腿干燥,拿野餐当借口延迟戒烟之类的。 这样的说法也让我自己感觉奇怪——这看起来就好像时间匆匆流逝这件事情比多喝水抑或是戒烟还重要似的,明明正是因为我在过去的一年里既没有怎么多喝水,又没有好好戒掉烟,或者还有什么我记不得的事情没有完成,才使得我会去在意一年过去这件事吧。 当然我也很快就原谅了自己的这点小愚蠢,迅速地开始享受早春午后的慵懒。 (过程略)

April 7, 2020 · Chock · Life

在 EdgeOS 上安装 ZeroTier

EdgeOS更新2.0固件后底层系统从Debian7直升到了Debian9,现在已经可以直接通过ZeroTier官方提供的Linux安装脚本进行安装了。 安装ZeroTier EdgeOS默认的apt源在国内的连接已经非常困难,非常容易因连接超时导致安装失败,建议自行替换国内镜像源。 sudo -i curl -s https://install.zerotier.com | sudo bash 安装成功后你将得到一个ZeroTier的Client ID。 接着用ZeroTier官网申请的网络ID来加入网络即可。 sudo zerotier-cli join [NETWORK-ID] 保护配置文件 为防止因固件升级导致配置文件丢失,我们可以把ZT的配置文件移动到/config/scripts再软连接回到原路径,这样在每次更新固件后重新执行一遍软连接就可以轻松恢复配置。 mv /var/lib/zerotier-one /config/scripts/ ln -s /config/scripts/zerotier-one 映射网络接口(可选) EdgeOS无法识别ZeroTier的接口(ZT0),因此ZT0不会反映到EdgeOS的WEBUI上面。但即便如此,ZeroTier依然能够正常工作。 如果你闲得蛋疼,路由器上又正好有空闲的网口没地方用,那么可以来试一下把zt0映射到eth(0~4)上面。 在/var/lib/zerotier-one下创建一个devicemap文件,内容如下(将X替换成你闲置的那个口,下略) <zerotiernetworkid>=ethX 重启ZeroTier /etc/init.d/zerotier-one restart 这时ifconfig下的ethX应该已经对应zt0的接口信息了。 set interfaces ethernet ethX description "ZeroTier [NETWORK-ID]" commit save

November 24, 2019 · Chock · Notes

过气 HTPC 升级记

HP Microserver Gen8 是我钟爱的一款适合当 NAS 的微型服务器,但当初考虑到客厅三星电视的Tizen OS 四舍五入相当于是无系统,NAS + HTPC 的方案看起来会挺棒,于是就有了这个玩意(现在看来这是一个坏主意)。 到目前为止(2年来),它的软硬件都经历了不少变化,从 SteamOS 到 OMV 再到 Windows, 从G3900 到 G4560 再到 G4600,期间还更换过主板加过内存,唯一没变的也许只有这个卧室机箱,可以说是机走箱还在了。 OS 方面,各种 NAS 系统其实我试过许多,包括上面没有提及的 Nas4Free、Freenas 等等,但从整体来看我的 OS 选择基本上是从 Linux 到 Windows 的过渡,这里面其实没什么特别的理由,仅仅是 Linux 上的应用目前还不能很好地不支持HEVC硬解 。 CPU 方面,G3900 换成 G4560 的原因依然是为了 HEVC 的硬解( G3900 仅支持到 HEVC 8Bit ),而事实上 G4560 也依然未能成为 4K 电影的解决方案,其原因就在于 4K 电影几乎标配 HDR。为了迎合 Intel 的核显 HDR 支持方针,我又把 CPU 换成了搭载 HD630 的 G4600。然而我只算到了显卡的要求,实际上因为 HDMI1.4 和 DP1.2 本身无法输出 HDR 内容,这一切又成了无用功。 ...

May 9, 2019 · Chock · Notes