内容
<p align="center">
<img src="Logo/logo_about.png" alt="Orynivo" width="720">
</p>
# 奥里尼沃
一款适用于 Windows、Linux 和 macOS 的桌面音乐库,以及适用于本地高保真音乐库的跨平台音乐服务器。
cwASIO/Steinberg ASIO/WASAPI · DSD/DSF/DFF · 无缝播放 · ReplayGain · 参数均衡
Plex · 电台 · 播客 · AI 聊天 · MCP 服务器 · 网络流媒体
## 为什么选择奥里尼沃?
奥里尼沃适用于那些仍然拥有和管理本地音乐库,并希望拥有现代化 Windows、Linux 或 macOS 播放器,且具有严肃的音频输出支持 - 以及从网络上的任何设备访问该库的能力的人。
- 通过 Linux 上的直接 ALSA 无桥接原生 DSD 播放,或通过 Windows 上的 cwASIO/可选 Steinberg ASIO 桥接
- 独家 WASAPI、cwASIO 和 Steinberg ASIO 输出配置文件
- 无缝播放
- CUE 表支持
- ReplayGain 和参数均衡
- 本地库、播放列表、智能播放列表和全文搜索
- 统一的本地和奥里尼沃服务器艺术家浏览:匹配的艺术家仅出现一次
在艺术家和搜索中,每个艺术家链接打开一个跨这些库的组合专辑视图
不管点击的项目来自哪个源。缓存的传记和图像在匹配的身份中共用,
新的配置文件下载或手动图像选择同步到每个源
- 通过本地 LLM、LM Studio/Ollama/OpenAI 兼容的端点进行 AI 控制
- 外部 AI 助手使用的 MCP 服务器
- **奥里尼沃服务器** - 一个无头跨平台音乐服务器(Linux、macOS、Windows),
通过 REST 和 HTTP 流媒体在本地网络上公开同一个库
[](LICENSE)
Windows 桌面版包含 cwASIO/Steinberg ASIO 和 WASAPI 播放。Linux 桌面版是一个单独打包的播放器,具有直接 ALSA 硬件配置文件,可实现精确速率 PCM 和原生 DSD 输出,无需重采样,同时还支持 OpenAL 系统路由,通过 PipeWire、PulseAudio 或 ALSA。 它支持 FFmpeg 解码的本地文件、远程流、 CUE/MKA 分段、无缝队列、搜索、ReplayGain、PCM 增强和参数均衡器。macOS 桌面版通过系统 OpenAL 输出路径提供相同的库、流媒体、播放列表、电台、播客、AI 聊天、MCP 和 PCM 处理功能,适用于 Intel 和 Apple Silicon。原生 DSD 输出仅在 Windows ASIO/cwASIO 或 Linux 直接 ALSA 上可用,而 Windows 系统媒体传输控件仍然是 Windows 特有的。
设置 > 播放提供互斥的 DSD 路由偏好,用于有损 DSD 到 PCM 的转换和 PCM(DoP)上的比特完美 DSD。DoP 需要一个 DoP 兼容的 DAC 和一个精确速率输出路径;PCM 音量、ReplayGain、增强和均衡器处理不适用于封装的 DSD 有效载荷。Linux 路径支持本地和奥里尼沃服务器流式的立体声 DSF 和未压缩的立体声 DFF/DSDIFF,通过直接 ALSA。当 ALSA 公开原生 `DSD_U32_BE` 硬件格式时,奥里尼沃直接将比特完美 DSD 发送到 DAC;否则,它使用 DoP 作为回退(例如,DSD64 的 176.4 kHz 载波)。Linux DSD 路径都不需要 cwASIO、Steinberg SDK 或奥里尼沃原生桥接。
在 Linux 上,Plex 和通用流媒体凭证仅在当前进程中保留,不会持久化,因为现有的加密凭证存储使用 Windows DPAPI。这避免了明文写入机密。
该应用程序在启动屏幕、侧边栏和关于对话框中使用奥里尼沃商标,以及基于独立徽标的多分辨率 Windows 应用程序图标。
> 该项目正在积极开发中。数据库架构、用户界面和可用功能可能会发生变化。
## 桌面版构建
桌面项目从构建主机中选择其目标:
- Windows 构建目标为 `net8.0-windows10.0.19041.0`,并包含现有的 WASAPI/ASIO 集成。
- Linux 构建目标为 `net8.0`;PCM 音频通过直接 ALSA 或 OpenAL 渲染,而
Windows 端点音量和系统媒体集成被兼容性服务取代。
- macOS 构建目标为 `net8.0`;PCM 音频通过 Apple 的系统 OpenAL 框架渲染。Windows 音频、端点音量和 SMTC 集成被兼容性服务取代,本地 DSD 输出当前不可用。
- Linux 输出配置文件公开 OpenAL 和直接独占 ALSA 作为单独的输出类型。OpenAL 仅列出 PipeWire/系统路由设备;直接 ALSA 仅列出需要独占访问的 `hw:` 端点。选择另一个桌面默认输出不会释放 PipeWire 仍拥有的声卡;必须禁用其系统声音设备配置文件,然后才能打开直接 ALSA。
- Linux 目标固定 Tmds.DBus.Protocol 0.92.0,以便在 Avalonia 的 UI 分发器关闭时,D-Bus 观察器清理保持非阻塞。
使用 .NET 8 构建 Linux 桌面版:
```bash
dotnet restore Orynivo/Orynivo.csproj
dotnet build Orynivo/Orynivo.csproj --configuration Release
dotnet run --project Orynivo/Orynivo.csproj
```
创建与 CI 生成的相同的自包含 `linux-x64` 输出:
```bash
dotnet restore Orynivo/Orynivo.csproj --runtime linux-x64
dotnet publish Orynivo/Orynivo.csproj --configuration Release \
--runtime linux-x64 --self-contained true --no-restore \
--output artifacts/Orynivo-linux-x64
```
版本标签发布 `linux-x64` 和 `linux-arm64` 的自包含桌面版。每个架构都接收一个便携式 `.tar.gz`、一个 DEB 包和一个 RPM 包;Arch Linux 还接收一个 `x86_64 .pkg.tar.zst`。已安装的包将奥里尼沃放在 `/usr/lib/orynivo` 下,添加 `orynivo` 命令,并注册一个桌面启动器。所有 Linux 播放器工件都受签名发布清单的覆盖。
为任一支持的架构构建和发布 macOS 桌面版:
```bash
dotnet restore Orynivo/Orynivo.csproj --runtime osx-arm64
dotnet publish Orynivo/Orynivo.csproj --configuration Release \
--runtime osx-arm64 --self-contained true --no-restore \
--output artifacts/Orynivo-osx-arm64
```
在 Intel Mac 上使用 `osx-x64` 代替。标记的版本将两个运行时标识符作为自包含的可安装 PKG、便携式 `Orynivo.app` ZIP 和 tar 存档。FFmpeg 和 FFprobe 必须单独安装并在 `PATH` 上可用;macOS 提供 OpenAL。
X11 或 Wayland 桌面会话是运行 Avalonia UI 所需的。FFmpeg 和 FFprobe 必须安装并在 `PATH` 上可用,用于播放、媒体探测、波形、ReplayGain 分析和其他基于 FFmpeg 的库函数。设置通过与启动时使用的相同定位器检查平台适当的执行文件名。ALSA 运行时(`libasound.so.2`,通常打包为 `libasound2`)是直接硬件输出所必需的。OpenAL 运行时(`libopenal.so.1`,通常打包为 `libopenal1`)是系统/默认路由所必需的。
## AI 集成
奥里尼沃包括两个互补的 AI 接口,它们共享相同的 23 个播放器控制、队列管理和库工具。
### 嵌入式 AI 聊天
**KI-聊天** 侧边栏视图连接到任何 OpenAI 兼容的 LLM 端点 - [LM Studio](https://lmstudio.ai/)、[Ollama](https://ollama.com/)、OpenAI、Anthropic(通过兼容层)或任何自定义 `/v1/chat/completions` 提供程序。不需要外部配置文件或 MCP 服务器:工具直接在应用程序内调度。
响应逐个 token 流式传输。模型自主调用工具 - 询问 *"Spiele alle Beatles-Alben"* 会使其搜索库、填充队列并启动播放,所有操作都在一个回合中完成。
在 **设置 → 集成 → KI-聊天/AI 聊天** 下配置端点 URL、API 密钥、模型名称和最大令牌限制。LM Studio 和 Ollama 无需 API 密钥。
侧边栏条目可独立显示或隐藏在 **设置 → 外观** 下,而无需禁用或删除保存的 AI 聊天配置。
**可用工具:**
| 类别 | 工具 |
| --- | --- |
| 状态 | `get_now_playing`、`get_queue`、`get_current_time` |
| 播放 | `play`、`pause_resume`、`next_track`、`previous_track`、`stop`、`seek`、`set_volume` |
| 队列 | `queue_append`、`queue_play_next`、`clear_queue`、`replace_queue` |
| 库 | `search_library` |
| 播放列表 | `list_playlists`、`get_playlist_tracks`、`create_playlist`、`create_smart_playlist` |
| 历史记录 | `get_play_history` |
| 网络 | `search_web`、`fetch_page`、`fetch_page_as_markdown` |
模型自动选择合适的队列工具:`replace_queue` 清除旧列表并立即开始播放;`queue_append` 在用户想要添加更多内容时添加到现有队列中;
`clear_queue` 在不中断当前曲目的情况下清空队列。库搜索包括配置的奥里尼沃服务器库作为不透明的 `orynivo://serverId/track/trackId` 引用。播放和队列工具在应用程序内解析这些引用,因此 API 密钥和身份验证的流 URL 不会暴露给模型。
### MCP 服务器
与外部 AI 助手(如 [Claude Desktop](https://claude.ai/download))相同的 23 个工具可作为嵌入式 **模型上下文协议(MCP)** HTTP/SSE 服务器使用。在 **设置 → 集成 → MCP 服务器** 下启用它,选择一个端口(默认为 **49200**),并将您的助手指向 `http://localhost:49200/mcp`。服务器仅绑定到 `localhost`。每个工具都有一个单独的启用/禁用切换开关,因此您可以限制外部助手允许执行的操作。网络工具(`search_web`、`fetch_page`、`fetch_page_as_markdown`)通过 MCP 服务器路由,而不是直接通过模型:搜索使用可配置的 SearXNG 实例,页面获取针对 SSRF(http/https 仅限,阻止私有/环回地址,响应大小/重定向/超时限制,无任意下载,请求日志记录)进行加固。在 **设置 → 集成 → MCP 服务器 → 网络浏览** 下配置 SearXNG URL 和限制。
## 奥里尼沃服务器
`Orynivo.Server` 是一个自包含的无头音乐服务器,在 **Windows、Linux 和 macOS** 上运行。它扫描相同的本地库目录并在本地网络上公开它们,以便任何 HTTP 客户端 - 另一个奥里尼沃实例、媒体播放器或自定义应用程序 - 都可以浏览和流式传输您的音乐。
### API
除 `/api/health` 外,所有端点都需要预共享的 API 密钥作为 `X-Api-Key` 头或 `?key=` 查询参数。查询参数形式直接适用于 FFmpeg 和浏览器 URL。
| 端点 | 描述 |
| --- | --- |
| `GET /api/health` | 状态 - 不需要身份验证 |
| `GET /api/info` | 服务器名称、版本和配置的库路径 |
| `GET /api/settings/library-paths` | 配置的库根路径 |
| `PUT /api/settings/library-paths` | 替换配置的库根路径,持久化它们,刷新监视器并启动扫描 |
| `GET /api/files/directories?path=` | 浏览服务器端目录以选择远程路径 |
| `POST /api/scan` | 触发完整库扫描 |
| `GET /api/scan` | 扫描状态,当前根,处理/总计数,当前文件,最后一个结果,错误和 `LibraryChangedAt` 用于客户端缓存失效 |
| `GET /api/artists` | 所有艺术家(id,名称,收藏夹,传记/图像标志) |
| `GET /api/artists/{id}` | 完整的艺术家元数据,包括缓存的传记/源字段 |
| `POST /api/artists/{id}/profile` | 存储客户端更新的艺术家传记/源字段和可选图像字节 |
| `POST /api/artists/{id}/rename` | 重命名一个艺术家或将其与匹配的艺术家合并 |
| `GET /api/artists/{id}/albums` | 一个艺术家的专辑 |
| `GET /api/albums` | 所有专辑(id,标题,显示艺术家,年份,艺术品路径) |
| `GET /api/albums/{id}/tracks` | 一个专辑的曲目列表 |
| `GET /api/tracks` | 分页曲目列表(`?page=0&pageSize=500`) |
| `GET /api/tracks/{id}` | 一首曲目的完整元数据 |
| `GET /api/tracks/{id}/waveform` | 用于传输进度视图的缓存紧凑波形峰值数据 |
| `GET /api/tracks/{id}/lyrics` | 一首曲目的缓存纯/同步歌词 |
| `PUT /api/tracks/{id}/lyrics` | 存储服务器上的客户端下载的歌词 |
| `GET /api/tracks/facets` | 曲目过滤的轻量级分面行(类型,格式,比特率) |
| `GET /api/library/summary` | 不实例化库行的聚合专辑,曲目,艺术家和收藏夹计数 |
| `POST /api/tracks/by-ids` | 一些曲目 ID 的曲目行(分面过滤结果) |
| `GET /api/folders/tracks` | 用于构建服务器库文件夹树的轻量级曲目行和播放元数据 |
| `GET /api/artwork/album/{id}?size=96` | 专辑封面缩略图或原始图像 |
| `PUT /api/artwork/album/{id}` | 在服务器上存储原始客户端选择的专辑封面字节 |
| `GET /api/artwork/artist/{id}` | 服务器存储的艺术家图像 |
| `PUT /api/artwork/artist/{id}` | 存储原始客户端选择的艺术家图像字节 |
| `GET /api/playlists` | 所有播放列表(常规和智能) |
| `GET /api/playlists/{id}/tracks` | 解析的曲目列表(智能播放列表实时评估) |
| `POST /api/playlists/{id}/resolve` | 在应用客户端收藏曲目 ID 的情况下解析智能播放列表 |
| `POST /api/playlists/resolve-count` | 返回 ad-hoc 智能播放列表的匹配计数 |
| `POST /api/playlists/{id}/tracks` | 将服务器曲目 ID 追加到常规播放列表 |
| `DELETE /api/playlists/{id}` | 删除服务器上的播放列表 |
| `DELETE /api/playlist-tracks/{id}` | 从服务器播放列表中删除一个条目 |
| `GET /api/search?q=` | 全文搜索 - 返回匹配的曲目 |
| `GET /api/search/full?q=` | 类别搜索 - 返回曲目,专辑和艺术家 |
| `GET /api/stream/{trackId}` | 常规文件的字节范围 HTTP 流式传输;CUE 虚拟曲目 FLAC 转码 |
| `GET /api/stream/path?p=` | 按绝对文件路径流式传输 |
| `GET /api/artwork/album/{id}?size=` | 专辑封面(`size=96` 或 `size=320` 用于缩略图) |
| `GET /api/artwork/track?p=` | 按文件路径获取曲目封面 |
| `GET /api/artwork/track/{id}?size=` | 按曲目 ID 获取曲目封面(`size=96` 或 `size=320` 用于缩略图) |
### 配置
在首次使用前编辑 `appsettings.json:
```json
{
"Orynivo": {
"ServerName": "Orynivo Server",
"ApiKey": "change-this-to-a-long-random-string",
"LibraryPaths": ["/music", "/mnt/nas/music"],
"ScanOnStartup": true,
"CalculateMissingReplayGainDuringScan": false,
"AllowRemoteUpdates": false
}
}
```
`CalculateMissingReplayGainDuringScan` 默认值为 `false`。嵌入式 ReplayGain 标签仍然被导入,而昂贵的 FFmpeg 分析在正常发现扫描期间被跳过。启用它可以大大延长扫描大文件或有章节的文件(如完整的 MKA 容器)。
`AllowRemoteUpdates` 默认情况下被禁用。当启用时,在打包的 Linux 服务器上,身份验证的奥里尼沃客户端可以下载匹配的 DEB/RPM 版本,将其转发到没有互联网访问的服务器并请求安装。服务器再次验证签名清单和服务器进程仅阶段文件。狭窄范围的根 systemd 升级程序执行包管理器操作并重启服务。便携式、开发、Windows 和 macOS 服务器安装程序当前报告的受管更新为不支持。
服务器绑定到 `http://0.0.0.0:5280` 默认情况下。在 `appsettings.json` 中覆盖端口下的 `Kestrel:Endpoints:Http:Url`。
当 Windows 播放器连接到奥里尼沃服务器时,服务器的音乐目录也可以通过设置中的库 > 奥里尼沃服务器连接对话框进行管理。目录浏览器显示服务器文件系统,而不是本地 Windows 文件系统:Unix 类服务器在 `/` 处打开,而 Windows 服务器公开其驱动器根目录。相同的对话框可以启动服务器扫描并显示扫描进度,而大目录正在扫描时。无法访问的子目录(如 Linux `lost+found` 文件夹)被跳过,而不是中止完整的扫描。配置的奥里尼沃服务器连接被合并到主要的艺术家,专辑,曲目和搜索结果库视图中。服务器的行用可选的 `OS` 源徽章标记,显示服务器名称为工具提示。
Windows 客户端探测服务器兼容性,在设置中显式报告缺少的新端点,显示服务器不可用时的最后成功连接时间,并且可以清除缓存的远程艺术品,曲目列表和服务器或全局的文件树。
## 功能特点
- 通过直接 ALSA 或 OpenAL 在 Linux 上播放,以及通过 cwASIO、Steinberg ASIO 桥或独占模式 WASAPI 在 Windows 上播放
- 当源采样率超过选定的 ASIO 或 WASAPI 设备的容量时,通过 `ffmpeg` 自动进行 PCM 降级;WASAPI 使用最高支持的 32 位浮点、24 位 PCM 或 16 位 PCM 输出格式
- 本地和 Orynivo-Server 流式传输的 DSF 和未压缩 DFF 文件的原生立体声 DSD 播放。Linux 直接使用内核/ALSA `DSD_U32_BE` 接口,具有 DoP 回落且无需 cwASIO/Steinberg/native 桥依赖;Windows 使用 cwASIO 或可选的 Steinberg ASIO 桥。远程流通过 HTTP 字节范围增量读取。
- 通过 WASAPI 进行实时 DSF/DFF 到 PCM 的转换,以便播放,活动转换和 PCM 采样率在传输和状态栏中显示
- 可选的强制 DSF/DFF 到 PCM 的转换,使用 cwASIO 或 Steinberg ASIO,允许音量、ReplayGain 和参数均衡器影响 DSD 源
- 为使用原生 DSD 的 DAC 用户提供可选的 +6 dB PCM 输出提升。提升仅适用于 PCM 播放路径;原生 DSD 保持比特完美。
- 通过 `ffmpeg` 进行 PCM 播放
- 多个命名输出配置文件,用于快速切换配置的输出设备;在传输栏中有一个快速选择弹出窗口,无需打开设置即可选择活动配置文件。在首次启动时,如果尚未配置输出,Orynivo 会从 Windows 默认多媒体输出设备创建一个并选择一个 `默认` WASAPI 配置文件。
- 搜索、音量控制、暂停和可编辑的持久 **下一曲** 队列,支持播放下一曲/追加操作、从曲目、专辑和文件夹视图拖放、删除、重新排序、完全清除、恢复上一个队列、播放列表保存和随机播放,队列内不重复曲目。队列存储在 SQLite 库数据库中,而不是 JSON 设置文件。
- 可选的淡入/淡出过渡可以平滑队列推进,这些推进不会被无缝 PCM 引擎处理
- 传输进度控制显示波形样式的峰值视图,用于本地音频文件和远程 Orynivo Server 跟踪,缓存紧凑的峰值数据,并在同一时间轴上保持点击/拖动搜索。远程曲目首先使用服务器波形端点,如果服务器无法分析源格式,则回落到本地 FFmpeg 分析认证的流 URL。
- 远程 Orynivo Server 跟踪在其库标题、艺术家、专辑和持续时间在传输元数据、“下一曲”队列和播放历史记录中。`?key=` 流 URL 不显示为标题,不会持久化在播放队列中。
- 配置的 Orynivo Server 库包含在与本地库相同的艺术家、专辑、曲目和搜索结果基础设施中。服务器行重用本地表格/艺术品遮罩,并显示一个可选的 `OS` 源徽章,服务器名称作为工具提示。为了避免 Avalonia DataGrid 卡顿,混合本地/服务器行在第一次表格绑定之前加载到组合的行集,而不是在用户滚动时替换已经可见的表格。远程艺术品从认证的服务器艺术品端点惰性加载,并在 Windows 客户端的本地数据目录中缓存。
- 跟踪筛选器包括一个 **来源** 部分,包含本地和每个配置的 Orynivo Server。保存的智能播放列表可以通过稳定的来源键(`local`、`server:<id>`)存储相同的来源限制。
- 远程 Orynivo Server 艺术家信息页面支持重命名/合并艺术家和分配维基媒体艺术家图像。Windows 客户端执行图像搜索并将选定的图像上传到服务器。对于统一的艺术家,传记和图像与匹配的本地和可达的 Orynivo Server 身份同步,同时手动图像保持受保护。
- 从选定的艺术家打开远程服务器专辑最初将专辑曲目范围限定在该艺术家,与本地专辑使用的复选框相同,以显示专辑中的所有曲目。
- Orynivo Server 文件夹结构视图中的文件和目录上下文菜单可以将曲目追加到现有的混合播放列表或创建新的共享本地播放列表。文件夹后代存储为稳定的 `orynivo://` 引用;认证播放 URL 不会作为播放列表条目写入。
- 播放列表位于库侧边栏下,可以包含混合的本地和 Orynivo Server 跟踪。服务器跟踪在本地播放列表中存储为稳定的 `orynivo://` 引用,仅在打开或排队时解析为认证流 URL,因此 `?key=` 流 URL 不会持久化。播放列表表格首先显示收藏的心形图标,其次是来源列。智能播放列表针对组合的本地和配置的 Orynivo Server 跟踪集进行解析。
- 远程 Orynivo Server 艺术家、专辑和曲目可以标记为收藏;这些收藏标志仅存储在 Windows 客户端的设置中。
- 远程 Orynivo Server 专辑封面和艺术家图像可以从 Windows 客户端搜索;客户端上传选定的图像字节到服务器,服务器将其存储在自己的艺术品缓存中。
- 远程 Orynivo Server 艺术家简介可以从 Windows 客户端刷新。Last.fm 或 Wikipedia 请求在客户端运行;服务器仅接收生成的简介、来源 URL、语言和可选的图像字节以进行缓存。
- Windows 系统媒体传输控件与全局媒体键集成,播放/暂停/上一曲/下一曲/停止和搜索请求,系统叠加层和锁屏元数据,专辑封面,播放状态和时间线同步
- PCM 播放的可选 ReplayGain 音量调整,使用曲目或专辑增益元数据,并回落到其他可用值;原生 DSD 输出保持比特完美。当当前 PCM 跟踪启用 ReplayGain 时,会出现一个小传输徽章。FFmpeg 在扫描期间自动计算缺失的 ReplayGain 值是可选的,默认情况下禁用;始终导入嵌入式标签,仍然可以手动计算缺失的值。
- 多个命名的参数 PCM 均衡器,带有一个选定的配置文件,一个实时的频率响应图,可编辑的预放大器,动态的筛选行,持久的开启/关闭状态,以及 Equalizer APO/AutoEQ 文本配置文件导入。支持预放大器,峰值,低/高架,低/高通滤波器,和 `GraphicEQ` 配置文件;更改在播放期间交叉淡入,本地 DSD 输出保持比特完美
- 带有多个监视目录的 SQLite 音乐库
- 大型 FLAC/WAV 镜像的 CUE 表支持:索引的 CUE 条目作为独立的虚拟曲目出现在库、文件夹、搜索、队列、播放列表和播放历史工作流中,同时保留共享的物理音频文件
- 自动递归库监视,带有防抖动创建、更新、重命名和删除处理,以及周期性完整协调作为安全网
- 通过 TagLibSharp 进行元数据和嵌入式艺术品提取
- 艺术家、专辑、曲目和文件夹视图
- 可调整大小的表格列,其宽度分别针对每个库、搜索、播放列表、Plex、广播、电台和历史表格单独保存
- 通过右键单击表格标题进行上下文敏感的列选择,包括本地曲目的可选技术和标签元数据以及广播和播客的适当目录字段
- 拖放表格列排序,独立于每个表格和主内容视图持久保存
- 主侧边栏中的空间节省型折叠部分,具有可配置的可见性和独立扩展的持久性,适用于库、个人电台、播客和播放列表部分;Internet Radio、Podcasts 和 **下一曲** 侧边栏项目可以独立隐藏在设置中
- 导航和浏览的细微界面运动:侧边栏折叠行淡入/淡出,仪表板和库视图更改淡入,艺术品卡片显示轻量级悬停叠加层,较长的内容加载使用紧凑的骨架/进度状态而不是静态空白/加载视图。
- 链接的艺术家和专辑名称,用于直接导航到艺术家专辑和专辑曲目
- 会话范围的后退导航,跨侧边栏视图、搜索结果、仪表板链接、艺术家/专辑钻取、播放列表、播客、广播、文件夹和 Plex 库视图
- 保守的艺术家名称规范化,用于 `feat.` 积分和明确的案例、口音、间距和标点符号变体,具有现有库的修复操作
- 实时 A-Z/# 快速导航,位于字母排序的艺术家、专辑和曲目列表旁边
- 艺术家和专辑视图,带有表格和虚拟化艺术品模式,包括仅限收藏的筛选功能
- 仪表板,带有艺术品背景的欢迎英雄,轻微的艺术品边缘,实时的库计数器(包括本地和配置的 Orynivo Server 跟踪收藏),随机播放和队列快捷方式,并行最近播放/最近添加的艺术品条带,来源和历史卡片上的收藏状态,具有感知周期的七点标记和缓和的收听趋势图表,紧凑的比例类目/专辑/艺术家分析,快速访问和可点击的播放日历。专辑排名保留艺术品,链接的类目打开匹配的筛选跟踪列表。
- 可点击的已填充日历日,具有模态每日聆听历史;本地标题、专辑和艺术家链接打开相应的库视图,标题链接立即开始播放
- 通过免费的 Radio Browser 目录进行互联网电台搜索,直接播放,侧边栏中的持久个人电台,电台徽标和流媒体提供的实时 ICY 标题/艺术家元数据。当 ICY 更新和本地缓存的电台徽标推送到 Windows 媒体叠加层时。
- 使用规范的电台标签的多选类目筛选,用于电台搜索结果,构建的筛选选项来自完整的 Radio Browser 标签统计数据,而不是第一个结果页面;选择类目会运行新的服务器端电台查询
- 通过公共 Apple Podcasts 目录进行播客搜索,完整的 RSS/Atom 分集列表按最新排序,侧边栏中固定的持久播客,类目和馈送语言筛选器,已播放/进行中的状态和从保存的位置自动恢复
- 带有大艺术品、馈送描述和元数据、总集、未听和已启动集统计信息的播客详情卡片
- 当前正在播放的播客集的传输信息视图,居中的播客艺术品,出版数据,持续时间,类目和 RSS 摘要
- 电台和播客筛选目录在搜索前显示;输入搜索词后,筛选选项和计数会根据结果集重新计算
- 不需要输入标题即可使用播客类目和语言筛选器
- Lucene.NET 全文搜索,支持部分单词和德语变音符号变体
- 曲目、专辑和艺术家的收藏
- 常规播放列表和实时智能播放列表,包含元数据、库年龄、播放历史、排序和结果限制标准
- 智能播放列表直接从活动跟踪筛选器创建,可以通过侧边栏上下文菜单完善。编辑器在更改标准时预览实时匹配计数,包括统一的本地/服务器计数和服务器支持的服务器端计数。
- UTF-8 M3U8 导入和导出常规播放列表,包括相对本地路径、保留丢失的文件条目和 HTTP/HTTPS 流;受保护的 Plex URL 被排除
- 通过 cwASIO、Steinberg ASIO 和独占 WASAPI 实现无缝顺序 PCM 播放:下一个 FFmpeg 解码器被预取并交给现有的输出会话,而无需重新打开音频设备
- 主题感知表格高亮跟随当前听到的曲目,跨库、搜索、播放列表、电台、播客和 Plex 视图
- 后退导航在专辑和艺术家表格或艺术品视图中恢复上一个选择和滚动位置,在从钻取返回后
- 专辑封面更改和艺术家元数据/图像更新保留当前选择和列表位置
- 专辑曲目详情提供即时收藏按钮和艺术家信息操作,旁边是专辑元数据。专辑身份使用专辑标题加物理专辑根,因此存储在不同文件夹中的相同标题具有独立的列表条目、封面和收藏。汇编保持在一起,传统的 `CD1`/`CD2` 或 `Disc 1`/`Disc 2` 子文件夹作为一个多盘专辑详细视图内的单独组出现。磁盘表格完全展开,没有自己的滚动条,行选择不会移动外部页面。
- 从艺术家打开汇编,保持完整的专辑标题可见,初始过滤其曲目到该艺术家,并提供一个开关以显示所有分配的磁盘上的曲目。物理目录/磁盘标题仅在当前结果包含多个组时显示。
- 本地曲目、播客集和互联网电台会话的播放历史,包括位置和完成状态
- 通过 Cover Art Archive 的艺术品下载和手动 MusicBrainz 搜索,保留样式化的标点符号在主要查询中,并回落到标点符号规范化的变体
- 嵌入式或下载的歌词,带有同步的 LRC 高亮显示在播放期间
- 手动 LRCLIB 歌词搜索,可编辑标题和艺术家,结果预览和显式替换缓存的歌词
- 从 Wikipedia/Wikimedia 缓存的艺术家图像和本地化传记
- 手动 Wikimedia Commons 艺术家图像搜索,可编辑搜索文本
- 手动选择的艺术家图像在配置文件刷新、重命名和艺术家合并期间保持
- 艺术家信息视图中的艺术家重命名,包括一个事务性合并流程,具有明确选择要保留的艺术家配置文件
- ZIP 导出和导入托管库、播放列表、个人电台、固定播客、历史、艺术品和配置的库目录
- 现代浅色和深色主题,具有中性表面、共享的强调资源、封面派生的传输强调和精细的侧边栏/表格/传输样式
- 用于紧凑符号按钮的共享矢量图标、缺失本地库的清晰空白状态、服务器、电台和播客,以及正在播放的封面的迷你上下文菜单,用于打开专辑/艺术家、搜索封面艺术和切换收藏状态
- 交互式艺术品卡的渐变悬停轮廓、整个主侧边栏的源适当矢量图标(包括智能播放列表的匹配橙色矢量闪电图标),以及 Recently Played 和 Recently Added 的平滑箭头控制的 20 项轮播。它们的箭头位于节标题中 Show all 旁边,而不是覆盖艺术品,未可用的方向保持不变作为变暗的控件,因此标题永远不会移动
- Edge-aligned 等大仪表板概览卡和收听图表,带有每日短周期点,可读的稀疏日期标签和圆形 Y 轴上限;悬停任何点都会显示其日期和收听分钟,同时边界曲线平滑以保持绘制高度与 Y 轴比例成比例,而不会超过测量值
- 仪表板收藏总数与统一的收藏视图相匹配,只计算当前可解析的本地和 Orynivo Server 跟踪
- 德语、英语、法语和西班牙语用户界面
- 多个 Plex 媒体服务器配置,具有受保护的访问令牌和音乐库发现、艺术家/专辑/曲目浏览、文件夹导航和播放,包括 A-Z 根文件夹索引和多部分曲目解码为一个逻辑项目
- 提供者中立的流媒体接口,具有预备的 Qobuz 配置页面,用于未来批准的合作伙伴 API 访问
- 嵌入式 **MCP 服务器** (模型上下文协议),启用后,在设置 > 集成下,公开 23 个播放器、队列、播放列表、历史记录、库和受控 Web 浏览工具,以供任何 MCP 兼容的 AI 助手(例如 Claude Desktop)使用。工具可以单独启用或禁用,服务器仅绑定到 `localhost`,TCP 端口可配置(默认 49200)。
## 支持的格式
用户界面识别以下格式:
`DSF`、`DFF`、`FLAC`、`MP3`、`WAV`、`AIFF`、`M4A`、`MKA`(Matroska 音频)、
`AAC`、`OGG`、`Opus`、`WMA`,以及引用 PCM 源文件(如 FLAC 或 WAV)的 CUE 表。
PCM 格式由 `ffmpeg` 解码,Orynivo 在启动时如果 `ffmpeg` 未安装,则会自动在 Windows 上下载到 `%LOCALAPPDATA%\Orynivo\ffmpeg`。Windows 下载程序会从 GitHub 发布 API 解析当前的 BtbN LGPL ZIP 资产,因此它与固定的存档名称无关。实际的编解码器支持取决于构建。
包含 Matroska 章节的 MKA 文件会扩展为单独的可搜索和可播放的库曲目。通过 `ffprobe` 读取章节标题、艺术家、专辑、专辑艺术家、流派、年份、曲目编号和时间边界;物理 MKA 不会作为额外的整文件曲目显示。没有可用章节的 MKA 仍然是一个普通的库曲目。
MKA 章节探测限制了 FFprobe 的分析窗口,并在一个文件后超时 30 秒,因此损坏或慢速网络媒体不会阻止完整的扫描。仅限库的虚拟章节标题更正单独存储在 SQLite 中,并在后续扫描时保留,而不会更改 MKA 容器。
对于 CUE 表,Orynivo 使用 `INDEX 01` 边界在引用的源文件中查找和停止 FFmpeg;不会创建临时分割文件。
当选择 WASAPI 时,DSF 或 DFF 容器中的 DSD 音频会在不创建临时文件的情况下实时转换为 PCM。当选择 cwASIO 或可选的 Steinberg ASIO 后端时,DSF 和未压缩的立体声 DFF 可以作为原生 DSD 发送,如果驱动程序报告兼容的 DSD 支持;否则,Orynivo 可以回退到相同的 FFmpeg 支持的 DSD 到 PCM 路径。在 Linux 上,DSF 和未压缩的立体声 DFF 直接通过 ALSA 发送为原生 `DSD_U32_BE`,如果 DAC 支持的话,以 DoP 作为回退;不需要 ASIO 桥。
PCM 和转换的 DSD 在不支持的采样率和比特深度下由 `ffmpeg` 转换。
## 需求
### Windows 播放器
- Windows 10 或 Windows 11,x64
- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)(用于构建)
- [FFmpeg](https://ffmpeg.org/) - 如果未安装,则在启动时自动下载。
要使用特定的构建,请将 `ffmpeg.exe` 和 `ffprobe.exe` 放在 `PATH` 中,与 `Orynivo.exe` 放在一起,或放在 `%LOCALAPPDATA%\Orynivo\ffmpeg` 中。
- 对于 cwASIO:Visual Studio 2022 及 **C++ 开发** 工作负载和已安装的 ASIO 驱动程序
- 可选的 Steinberg 桥:Steinberg ASIO SDK 2.3
MIT 许可的 cwASIO 源代码包含在 `third_party/cwasio` 下,因此正常的构建提供了 ASIO 支持,而无需 Steinberg SDK。Steinberg ASIO SDK 未包含在仓库中。构建脚本通过 `-AsioSdkDir` 或 `ASIO_SDK_DIR` 环境变量接受其位置。它还会检查 `third_party\asiosdk`、`external\asiosdk` 和旧开发环境的兼容性 `C:\Dev\asiosdk_2.3`。当找不到 SDK 时,只提供 **cwASIO**。当 SDK 可用时,设置提供 **Steinberg ASIO** 和 **cwASIO**。
### Linux 播放器
- 具有 X11 或 Wayland 桌面的 Linux x86-64 或 ARM64
- `PATH` 中有 FFmpeg 和 FFprobe
- ALSA 运行时 (`libasound.so.2`) 用于直接 PCM、原生 DSD 和 DoP 输出
- OpenAL 运行时 (`libopenal.so.1`) 用于可选的系统路由输出
- 一个 DAC/ALSA 端点,支持 `DSD_U32_BE` 用于原生 DSD,或一个支持 DoP 的 DAC 用于回退播放
Linux 播放器不会构建或加载 `AsioBridge.dll` 或 `CwAsioBridge.dll`。原生 DSF 和未压缩的 DFF 输出直接通过 ALSA 发送,因此不需要 Steinberg ASIO SDK 或特定于平台的 Orynivo 桥。
### macOS 播放器
- macOS 10.15 或更高版本,适用于 Apple Silicon (`arm64`) 或 Intel (`x64`)
- FFmpeg 和 FFprobe 单独安装并在 `PATH` 中可用
- 系统 OpenAL 框架用于 PCM 输出
- Avalonia OpenGL 渲染,具有软件回退功能,适用于 Metal 着色器编译器超时 Skia 编译超时
没有 ASIO、cwASIO、ALSA 或原生 DSD 支持。
标记版本提供自包含的 PKG 安装程序和便携式应用包,因此不需要 .NET 运行时。开发构建需要 .NET 8 SDK。签名更新机制选择并验证与运行架构匹配的 PKG,然后打开正常的 macOS 安装程序。
### Orynivo 服务器
- Linux、macOS 或 Windows;x64 或 ARM64
- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)(用于构建;使用自包含发布包时不需要)
- [FFmpeg](https://ffmpeg.org/) - 推荐用于 CUE 表曲目转码(Debian/Ubuntu:`apt install ffmpeg`; Fedora/Rocky:从 RPM Fusion 安装)
- 封面缩略图生成使用捆绑的 SkiaSharp 原生 Linux 资产;不需要 ImageMagick 或其他外部图像转换工具。
- 没有 ASIO 驱动程序或 Windows 依赖项
## 下载
从 [发布](https://github.com/bschlaack/Orynivo/releases) 页面下载最新版本。
### Windows 播放器
| 软件包 | 描述 |
| --- | --- |
| `Orynivo-{version}-win-x64-Setup.exe` | 安装程序 - 开始菜单条目和卸载程序 |
| `Orynivo-{version}-win-x64-Portable.zip` | 便携式 - 任意位置解压并运行 `Orynivo.exe` |
两个软件包都是自包含的(.NET 8 捆绑,无需先决条件)。
### Linux 播放器
| 软件包 | 描述 |
| --- | --- |
| `Orynivo-{version}-linux-x64.tar.gz` | 便携式 x86-64 存档 |
| `Orynivo-{version}-linux-arm64.tar.gz` | 便携式 ARM64 存档 |
| `orynivo_{version}_amd64.deb` / `orynivo_{version}_arm64.deb` | Debian / Ubuntu |
| `orynivo-{version}-1.x86_64.rpm` / `orynivo-{version}-1.aarch64.rpm` | Fedora / Rocky / RHEL |
| `orynivo-{version}-1-x86_64.pkg.tar.zst` | Arch Linux x86-64 |
Linux 软件包在 .NET 方面是自包含的;FFmpeg、ALSA 和 OpenAL 仍然是系统运行时依赖项,如上所述。
标记版本会验证 Arch 存档是否包含其所需的根级 `.PKGINFO` 元数据,然后再发布。
### macOS 播放器
| 软件包 | 描述 |
| --- | --- |
| `Orynivo-{version}-osx-arm64.pkg` | Apple Silicon Mac 安装程序 |
| `Orynivo-{version}-osx-x64.pkg` | Intel Mac 安装程序 |
| `Orynivo-{version}-osx-arm64-Portable.zip` | Apple Silicon Mac 便携式 ZIP |
| `Orynivo-{version}-osx-x64-Portable.zip` | Intel Mac 便携式 ZIP |
| `Orynivo-{version}-osx-arm64.tar.gz` | Apple Silicon 替代应用存档 |
| `Orynivo-{version}-osx-x64.tar.gz` | Intel 替代应用存档 |
PKG 安装 `Orynivo.app` 在 `/Applications` 下。对于便携式使用,请解压 ZIP 并从任意可写目录打开 `Orynivo.app`。构建在 .NET 方面是自包含的;FFmpeg 和 FFprobe 必须安装并在 `PATH` 中可用。当前软件包未经代码签名或公示,因此 macOS Gatekeeper 可能需要从 Finder 的上下文菜单中显式打开应用程序或安装程序。
Orynivo 的启动和关于窗口更新检查支持两个 Mac 架构。它们从签名发布清单中选择匹配的 PKG,验证其 SHA-256 摘要,然后在 macOS 安装程序中打开它。安装仍然需要正常的显式 macOS 确认;Orynivo 绝不会自行调用特权安装命令。
### Linux 服务器
| 软件包 | 架构 |
| --- | --- |
| `orynivo-server_{version}_amd64.deb` | Debian / Ubuntu (x86-64) |
| `orynivo-server_{version}_arm64.deb` | Debian / Ubuntu (ARM64 / Raspberry Pi) |
| `orynivo-server-{version}-1.x86_64.rpm` | Fedora / Rocky / RHEL (x86-64) |
| `orynivo-server-{version}-1.aarch64.rpm` | Fedora / Rocky / RHEL (ARM64) |
所有软件包都是自包含的(.NET 8 捆绑)。参见 [服务器部分](#orynivo-server) 以了解安装后设置。
## 构建
克隆仓库:
```powershell
git clone https://github.com/bschlaack/Orynivo.git
cd Orynivo
```
### Windows 播放器
创建调试构建:
```powershell
.\build.ps1
```
脚本构建原生 x64 cwASIO 桥,可选地构建 Steinberg 桥,然后构建 .NET 应用程序。它通过 `vswhere.exe` 发现 Visual Studio,并使用 `MSBuild.exe` 从 `PATH` 回退。
路径可以在不修改项目文件的情况下提供:
```powershell
.\build.ps1 -AsioSdkDir 'D:\SDKs\asiosdk_2.3'
.\build.ps1 -Configuration Release
.\build.ps1 -Configuration Release -SkipAsio
.\build.ps1 -Configuration Release -SkipAsio -SkipCwAsio
```
对于持久的本地设置,请设置 `ASIO_SDK_DIR`。同样,MSBuild 发现也可以通过 `-MSBuildPath` 或 `MSBUILD_EXE_PATH` 覆盖。`-RequireAsio` 使缺少的 Steinberg SDK 导致构建失败。`-SkipAsio` 仅禁用 Steinberg 桥;`-SkipCwAsio` 禁用 cwASIO。
### Orynivo 服务器
服务器没有原生依赖项,可以在任何平台上构建:
```bash
dotnet build Orynivo.Server/Orynivo.Server.csproj
dotnet run --project Orynivo.Server/Orynivo.Server.csproj
```
要发布特定平台的自包含二进制文件:
```bash
# Linux x64
dotnet publish Orynivo.Server/Orynivo.Server.csproj \
--runtime linux-x64 --self-contained true --output out/linux-x64
# Linux ARM64
dotnet publish Orynivo.Server/Orynivo.Server.csproj \
--runtime linux-arm64 --self-contained true --output out/linux-arm64
```
### 发布构建(GitHub Actions)
推送版本号标签会触发两个并行的发布工作流:
```powershell
git tag v0.14.0
git push origin v0.14.0
```
| 工作流 | 运行器 | 输出 |
| --- | --- | --- |
| `release.yml` | Windows | `Orynivo-{v}-win-x64-Setup.exe`, `Orynivo-{v}-win-x64-Portable.zip` |
| `player-macos-release.yml` | macOS | Intel/Apple-Silicon PKGs, 便携式 ZIPs, and tar 存档 |
| `server-release.yml` | Ubuntu | `amd64`/`arm64` `.deb` 和 `x86_64`/`aarch64` `.rpm` 软件包 |
所有发布工作流都上传到同一个草稿 GitHub 发布。发布工作流仅接受语义 `vMAJOR.MINOR.PATCH` 标签,其提交包含在 `main` 中;版本号在构建时嵌入到桌面和服务器程序集。**工作流调度** 可能只会重建一个已经存在的标签,该标签通过相同的 `main` 包含检查。
在草稿发布后,`update-manifest.yml` 会计算支持的
Windows、Linux、macOS 和服务器软件包的哈希值,创建 `update-manifest.json`,用 `UPDATE_SIGNING_PRIVATE_KEY_PEM` Actions 机密对其进行签名,并将清单/签名附加到发布中。发布构建通过 `UPDATE_SIGNING_PUBLIC_KEY_BASE64` 仓库变量接收匹配的 ECDSA P-256 公钥。更新功能在这些值未配置时仍然不可用,而不是接受未签名的发布。
清单工作流等待 Windows 安装程序、每个 Linux 和 macOS 桌面工件以及所有四个支持的服务器 DEB/RPM 软件包。它失败而不是签名部分资产列表。为了修复已经发布的版本,请手动运行 **发布签名更新清单** 并输入其现有标签。
配置签名一次,从受信任的管理员机器(永远不要提交私钥):
```bash
openssl ecparam -name prime256v1 -genkey -noout -out update-signing-private.pem
openssl ec -in update-signing-private.pem -pubout -outform DER \
| base64 -w0 > update-signing-public.txt
gh secret set UPDATE_SIGNING_PRIVATE_KEY_PEM \
--repo bschlaack/Orynivo < update-signing-private.pem
gh variable set UPDATE_SIGNING_PUBLIC_KEY_BASE64 \
--repo bschlaack/Orynivo < update-signing-public.txt
```
较旧的 GitHub CLI 版本不提供 `gh variable`。升级 `gh`,或通过 GitHub API 创建公共仓库变量(该值是公共验证密钥,而不是私有签名密钥):
```bash
gh api --method POST repos/bschlaack/Orynivo/actions/variables \
-f name=UPDATE_SIGNING_PUBLIC_KEY_BASE64 \
-f value="$(cat update-signing-public.txt)"
```
如果变量已经存在,请将 `POST` 替换为 `PATCH`,并使用端点 `repos/bschlaack/Orynivo/actions/variables/UPDATE_SIGNING_PUBLIC_KEY_BASE64`。
存储私钥的离线备份;轮换它需要一个过渡版本,因为已经安装的构建在其自己的构建时信任嵌入的公钥。
关于窗口显示嵌入式版本,可以下载、验证并启动更新的 Windows 安装程序或匹配架构的 macOS PKG。设置 > Orynivo 服务器提供相同的签名更新,用于支持的 DEB/RPM 服务器,并从桌面中继发布,当服务器本身无法访问 GitHub 时。连接的服务器行显示其经过身份验证的信息端点返回的版本,完整的远程缓存操作使用标准的设置按钮处理。
设置 > 外观 > 更新控制客户端是否在后台检查签名清单,并在启动时报告更新的匹配桌面版本。通知提供本地化的 **下载并安装** 操作,启动与关于窗口相同的验证更新流程;如果没有此显式选择,则不会开始下载。
设置 > 外观还控制主窗口是否以最大化状态启动。当最大化启动被禁用时,Orynivo 记住最后一个正常的窗口大小和位置,并在该位置仍然与附加屏幕相交时仅恢复它。
服务器软件包上传使用路由特定的 1 GiB 安全限制,以便自包含的 DEB/RPM 软件包不会被 Kestrel 的较小默认请求限制拒绝。
服务器还会在加载可编辑的 `/etc/orynivo-server/appsettings.json` 后重新应用 `Kestrel:Limits:MaxRequestBodySize`,因此尽管配置文件的层叠顺序晚于创建构建器,但全局覆盖是有效的。当从关于窗口显式安装桌面更新时,Orynivo 首先将相同的签名版本中继到每个可访问的启用更新的配置服务器。如果服务器更新失败,其名称将在用户选择平台安装程序是否继续之前显示。
本地开发版本从 `origin/main` 中最新的语义 `v*` 标签派生其基准版本,并追加 `-dev+<commit>`;仅限开发分支可访问的标签故意被忽略。
## 项目结构
```text
Orynivo/
├── Native/AsioBridge/ 原生 C++ 桥接,用于 Steinberg ASIO SDK
├── Native/CwAsioBridge/ 原生 C++ 桥接,基于 cwASIO 构建
├── third_party/cwasio/ cwASIO 源代码,遵循 MIT 许可协议
├── Orynivo.Core/ 跨平台库(net8.0,无 Windows 依赖)
│ ├── Audio/ FFmpeg 解码器,均衡器,ReplayGain 实用工具
│ ├── Library/ SQLite 数据库,扫描器,Lucene 搜索,模型
│ └── Streaming/ 提供者中立的流媒体合约和模型
├── Orynivo/ Windows/Linux 桌面端(Avalonia UI)
│ ├── Audio/ ASIO,WASAPI,PCM 和 DSD 播放
│ ├── Controls/ 自定义 Avalonia 控件
│ ├── Localization/ 德语,英语,法语和西班牙语资源
│ ├── Mcp/ 嵌入式 MCP 服务器,播放器桥接和工具
│ ├── Streaming/ Windows 凭证存储和 Plex 客户端
│ └── MainWindow.* 主用户界面和导航
├── Orynivo.Server/ 跨平台无界面服务器(net8.0,ASP.NET Core)
│ ├── Endpoints/ REST 和流媒体端点处理程序
│ ├── Middleware/ API 密钥身份验证
│ ├── Services/ 库扫描和文件系统监视器服务
│ ├── Program.cs 服务器入口点
│ └── appsettings.json 默认配置
├── .github/
│ ├── server-release/ Linux 发布版的 systemd 单元和软件包脚本
│ └── workflows/ CI(dotnet-desktop.yml),Windows 发布版,服务器发布版
├── build.ps1 构建原生桥接和 Windows .NET 应用程序
└── Orynivo.sln Visual Studio 解决方案
```
## 本地数据
Orynivo 将其本地数据存储在 `%LOCALAPPDATA%\Orynivo\` 下:
- `settings.json`: 应用程序设置
- `streaming-credentials.dat`: Windows 用户绑定的加密流媒体密钥
- `plex-credentials.dat`: Windows 用户绑定的加密 Plex 访问令牌
- `library.db`: SQLite 音乐库和播放历史
- `logs\`: 时间戳化的崩溃报告,用于未处理的应用程序错误
- `artworks\`: 原始艺术作品和生成的缩略图
- `artist-images\`: 缓存的维基百科/Wikimedia 艺术家图像
- `search-index\`: Lucene.NET 搜索索引
- `catalog-filter-cache.json`: 缓存的电台类型和播客类别/语言
- `radio-logos\`: 缓存的互联网电台徽标,用于强大的 Windows 媒体叠加层艺术作品更新
这些文件不属于存储库。
注释按钮在传输栏中用大型歌词视图替换当前主内容。当前封面在背景中显示为淡入效果。Orynivo 首先使用缓存的同步歌词,然后下载或嵌入纯文本歌词作为备用。缺失的歌词可以从公共 LRCLIB API 请求并存储在 `library.db` 中;同步 LRC 行高亮显示并使用当前播放位置保持在视图中。刷新按钮执行新的查找,缺失的结果直接在歌词视图中显示。对于 WASAPI,缓冲但尚未可听的帧从播放位置中排除,以便同步歌词跟随实际输出时间。
艺术家页面支持与专辑相同的表格/艺术品模式。可见艺术家的配置文件在选定的 UI 语言中延迟加载,并在数据库和 `artist-images\` 中缓存。歌词按钮旁边的样式化信息按钮在主内容区域打开当前艺术家配置文件,显示大图像,简介,刷新操作和指向维基百科源的链接。从艺术家向下钻取打开一个专辑时,仅显示该艺术家的曲目。专辑标题提供一个开关以显示专辑上的所有曲目。
设置库页面可以将此托管库数据导出为 ZIP 存档并再次导入。音频文件不包含在内;其现有路径和配置的库目录在备份中保留。成功导入会重建搜索索引并重启应用程序状态。导出显示文件级进度并写入临时 `.tmp` 存档;仅在导出成功完成后,文件才被重命名为 `.zip`。导入在提取,验证,恢复艺术品,重新路径和重建搜索索引时使用相同的进度条。
## 当前限制
- Linux 输出配置文件包括直接 ALSA `hw:` 端点和 OpenAL 公开的端点。直接 ALSA 配置文件以曲目的 PCM 采样率打开 DAC,并禁用 ALSA 软件重采样;如果设备忙碌或无法接受确切的速率,则会显式失败。OpenAL 系统/默认路由可能仍会混合或重采样 PipeWire,PulseAudio 或 OpenAL。
- Linux 支持立体声 DSF 和未压缩的立体声 DFF/DSDIFF 作为原生,比特完美 `DSD_U32_BE` 通过兼容的直接 ALSA 端点,包括身份验证的 Orynivo 服务器流,具有 DoP 作为备用。DST 压缩的 DFF 仍然不支持直接 DSD 输出。DSD 不通过 OpenAL 发送,因为其混合,增益或格式转换可能会损坏有效载荷或 DoP 标记。
- 原生,比特完美的 DSD 播放可通过兼容的直接 ALSA 硬件在 Linux 上获得,并通过 cwASIO 或可选的 Steinberg ASIO 桥接在 Windows 上获得。WASAPI 可以通过实时将音频转换为 PCM 来播放 DSF/DFF。
- 没有可选的 Steinberg ASIO SDK 的构建仍然提供 ASIO,通过 vendored MIT 许可的 cwASIO 桥接。仅当两个原生 ASIO 桥接都不可用或故意跳过时,ASIO 才从设置中消失。
- 原生 DFF 播放目前仅支持未压缩的立体声文件。
- DST 压缩的 DFF 文件不原生播放。
- Kernel Streaming 在设置模型中表示,但尚未实现。
- Qobuz 目录访问和播放尚未激活。应用程序仅包含提供者中立的集成层和设置脚手架;需要批准的 Qobuz 合作伙伴 API 合同和官方端点文档。
- Plex 浏览分页以保持非常大的库响应迅速。播放可用性取决于每个选定的 Plex 媒体部分直接可访问并可由安装的 FFmpeg 构建解码。意外 HTTP 流终止从上一个解码位置重试,Orynivo 进入下一个队列项之前。
- 重命名或合并艺术家更新 Orynivo 的内部库,专辑分配和搜索索引。它不会修改音频文件中的标签。
- ASIO 设备在另一个应用程序独占地持有它们时可能无法检查或播放。
- 互联网电台的可用性,元数据和流格式取决于外部电台和 Radio Browser 目录。
- 播客搜索依赖于 Apple Podcasts 目录。剧集可用性和音频兼容性取决于每个发布者的 RSS/Atom 源和媒体附件。
- Steinberg ASIO SDK 必须单独获取并提供给构建脚本;它不能与此存储库一起分发。
## 贡献
错误报告和可复制的改进提案可以通过 [GitHub 问题](https://github.com/bschlaack/Orynivo/issues) 提交。对于音频问题,请包括输出后端,设备,文件格式和采样率。
## 依赖和通知
Orynivo 使用 MIT,Apache-2.0,LGPL-2.1-only 和其他兼容条款的组件。这包括 Avalonia,SkiaSharp,Lucene.NET,Microsoft.Data.Sqlite,NAudio,TagLibSharp,SQLitePCLRaw,cwASIO 及其传递依赖。
完整的归属和重新分发信息在 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) 中维护。适用的许可证文本在 [`licenses/`](licenses/) 中提供,并在构建和发布输出中复制。
FFmpeg 作为单独的可执行文件运行。如果未安装,Orynivo 通过 GitHub API 解析当前版本的资产,在 Windows 上将 BtbN LGPL 基本构建下载到 `%LOCALAPPDATA%\Orynivo\ffmpeg`。FFmpeg 仍然受其自己的许可约束,不受 Orynivo 许可的约束。
ASIO 是 Steinberg Media Technologies GmbH 的商标和软件。可选的 Steinberg ASIO SDK 不包含在此存储库中,必须单独获取和许可。 Vendored cwASIO 实现是独立的 MIT 许可实现。
## 许可证
版权 2026 Björn Schlaack。
Orynivo 的原始源代码和文档根据 [Apache License 2.0](LICENSE) 许可。许可证不授予 Orynivo 名称,字号,徽标或应用程序图标的商标权利。
第三方组件和可选的 Steinberg ASIO SDK 被排除在该授予之外,仍然受其各自条款的约束。参见 [NOTICE](NOTICE) 和 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器