Boring Notch
Boring Notch
让 MacBook 的刘海屏成为视觉焦点!告别单调的状态栏,Boring Notch 将其转变为动态的音乐控制中心,配备炫酷的可视化频谱和完整的音乐控制功能。但这仅仅是个开始,它还集成了日历、支持 AirDrop 的文件架等更多实用功能!
功能特性
- 动态音乐控制中心:将刘海屏区域变为集播放、暂停、切歌等功能于一体的控制面板。
- 音频可视化:在刘海屏处实时显示正在播放音乐的动态频谱效果。
- 媒体信息显示:展示当前播放歌曲的标题、艺术家等元数据。
- 日历集成:在状态栏区域便捷查看日程安排。
- 文件架功能:提供快速文件访问入口,并支持 AirDrop。
- 媒体远程控制适配:提供底层的媒体控制接口,支持获取播放状态、发送控制命令(如播放、暂停)、设置播放速度、随机/循环模式等。
- 国际化支持:通过 Crowdin 进行多语言本地化。
安装指南
项目采用持续集成/持续部署(CI/CD)流程,具体安装方法建议参考 GitHub Actions 工作流或项目发布的版本。
依赖项与系统要求
- 运行于 macOS 系统。
- 需要访问 macOS 的
MediaRemote框架以实现媒体控制功能。
使用说明
项目包含一个名为 mediaremote-adapter.pl 的 Perl 脚本,作为与 macOS MediaRemote 框架交互的适配器测试工具。
适配器脚本基本用法
运行脚本时不带参数或使用错误参数会显示帮助信息:
./mediaremote-adapter.pl
脚本参数说明:
FRAMEWORK_PATH: MediaRemoteAdapter.framework 目录的绝对路径(必需)。TEST_CLIENT_PATH: MediaRemoteAdapterTestClient 可执行文件的绝对路径(仅test功能需要)。FUNCTION: 要执行的功能。PARAMS/OPTIONS: 功能所需的参数或选项。
功能与命令示例
-
测试适配器权限 (
test): 检查适配器是否有权使用 MediaRemote 框架。返回非零退出码表示功能异常。./mediaremote-adapter.pl /path/to/framework /path/to/testclient test -
获取当前播放信息 (
get): 一次性打印所有可用的播放元数据。./mediaremote-adapter.pl /path/to/framework get- 选项
--now: 添加一个elapsedTimeNow键,估算当前已播放时间(可能有最多1秒误差)。 - 选项
--micros: 将时间相关的键值(如elapsedTime,duration)以微秒为单位输出,而不是默认的秒。
- 选项
-
流式输出播放信息 (
stream): 持续监听并输出播放信息的变化(默认显示差异)。./mediaremote-adapter.pl /path/to/framework stream- 选项
--no-diff: 禁用差异对比,每次都完整输出所有元数据。 - 选项
--debounce=N: 设置防抖延迟(毫秒),防止输出过于频繁(默认为0)。
- 选项
-
发送控制命令 (
send): 向正在播放的应用发送命令(如播放、暂停)。./mediaremote-adapter.pl /path/to/framework send 0 # 例如,发送播放命令 (kMRPlay = 0) -
控制播放状态:
- 跳转到指定位置 (
seek):./mediaremote-adapter.pl /path/to/framework seek 30000000 # 跳转到30秒(30000000微秒)处 - 设置随机播放模式 (
shuffle):./mediaremote-adapter.pl /path/to/framework shuffle off - 设置循环模式 (
repeat):./mediaremote-adapter.pl /path/to/framework repeat one - 设置播放速度 (
speed):./mediaremote-adapter.pl /path/to/framework speed 1.5 # 设置为1.5倍速
- 跳转到指定位置 (
核心代码
以下为项目中的媒体远程适配器核心脚本,用于与 macOS 媒体框架交互。
mediaremote-adapter.pl 脚本核心部分
#!/usr/bin/perl
# Copyright (c) 2025 Jonas van den Berg
# 本文件遵循 BSD 3-Clause 许可证。
# 使用信息请阅读下方说明或无参数运行本脚本。
use strict;
use warnings;
use DynaLoader;
use File::Spec;
use File::Basename;
# 打印帮助信息函数
sub print_help() {
print <<'HELP';
Usage:
mediaremote-adapter.pl FRAMEWORK_PATH [TEST_CLIENT_PATH]
[FUNCTION [PARAMS|OPTIONS...]]
FRAMEWORK_PATH:
Absolute path to the MediaRemoteAdapter.framework directory
TEST_CLIENT_PATH: (optional)
Absolute path to the MediaRemoteAdapterTestClient executable. Only for "test"
FUNCTION:
stream Streams now playing information (as diff by default)
get Prints now playing information once with all available metadata
send Sends a command to the now playing application
seek Seeks to a specific timeline position
shuffle Sets the shuffle mode
repeat Sets the repeat mode
speed Sets the playback speed
test Tests if the adapter is entitled to use the MediaRemote framework.
An exit code other than 0 indicates the adapter is non-functional
PARAMS:
send(command)
command: The MRCommand ID as a number (e.g. kMRPlay = 0)
seek(position)
position: The timeline position in microseconds
shuffle(mode)
mode: The shuffle mode
repeat(mode)
mode: The repeat mode
speed(speed)
speed: The playback speed
OPTIONS:
get
--now: Adds an "elapsedTimeNow" key with an estimation of the current
elapsed playback time. This estimation may be off by up to a second.
To determine a more accurate time without polling "get" continuously,
calculate it using the "elapsedTime" and "timestamp" keys. "elapsedTime"
contains the elapsed time at the time that is stored in "timestamp".
stream
--no-diff: Disable diffing and always dump all metadata
--debounce=N: Delay in milliseconds to prevent spam (0 by default)
get, stream
--micros: Replaces the following time-related keys' unit from seconds to microseconds:
elapsedTime, elapsedTimeNow, duration
HELP
}
# 脚本主逻辑从这里开始...
# (此处应包含参数解析、功能分发以及与框架交互的具体实现代码)
安全策略
Bored Team 及社区高度重视 Boring Notch 中的安全漏洞。我们感谢您负责任地披露发现的问题,并将尽力认可您的贡献。
报告漏洞: 请使用 GitHub 安全公告中的 "报告漏洞" 选项卡。
团队会回复您并说明处理报告的后续步骤。在初步回复后,我们将向您通报修复进度和完整公告,并可能要求提供更多信息或指导。
第三方依赖漏洞: 请将第三方依赖包中发现的安全漏洞报告给维护该包或依赖的个人或团队。