airsonic-advanced
所有应用 · 0 个应用
Docker 应用
Airsonic-Advanced 是 Airsonic 分支的现代化实现版本,在性能和功能方面进行了多项重要增强,并新增和替代了 Airsonic 中的部分功能。
Airsonic-Advanced 是 Airsonic 分支的现代化实现版本,在性能和功能方面进行了多项重要增强,并新增和替代了 Airsonic 中的部分功能。
Airsonic 是什么?
Airsonic 是一款免费、基于 Web 的媒体串流服务器,让你随时随地访问自己的音乐。你可以用它与朋友分享音乐,也可以在工作时聆听自己的音乐。它支持同时向多个播放器串流,例如厨房和客厅各使用一个播放器。
Airsonic 专为处理超大型音乐收藏而设计,可管理数百 GB 的音乐。虽然它针对 MP3 串流进行了优化,但也支持所有能够通过 HTTP 串流的音频或视频格式,例如 AAC 和 OGG。借助转码插件,Airsonic 可以即时转换并串流几乎所有音频格式,包括 WMA、FLAC、APE、Musepack、WavPack 和 Shorten。
如果带宽有限,你可以为音乐串流设置最高比特率。Airsonic 会自动将音乐重新采样为合适的比特率。
除了作为媒体串流服务器,Airsonic 也非常适合作为本地点唱机使用。直观的 Web 界面、搜索和索引功能都针对大型媒体库进行了优化,方便你高效浏览内容。Airsonic 还内置 Podcast 接收器,提供许多与 iTunes 类似的功能。
Airsonic 使用 Java 编写,可运行于大多数平台,包括 Windows、Mac、Linux 及各种 Unix 系统。
功能增强:
以下列出部分相较于 Airsonic 得到增强的功能:
- 采用更现代的基础框架和库
- Spring Boot 2.x(替代 1.x)、Spring Framework 5.x(替代 4.x),以及因基础库升级而带来的各种依赖升级,包括 EhCache、SQL 连接器等
- 安全性
- 全面重构凭据系统,真正安全地存储凭据,不再明文保存。对于需要日后取回的凭据(例如第三方存储位置的凭据),支持加密,同时保持向后兼容。密码存储还采用 bcrypt、Argon 等现代密码哈希算法。
- 规范合规性:更符合 Web 规范,并通过框架实现相关功能,取代自行开发的解决方案
- 支持 RFC 7233 中定义的 Range 请求头
- 正确发送 ETag 和 Last-Modified 响应头,帮助客户端进行缓存
- 性能优化
- 采用管道和多线程机制,提供更高效且更符合规范的流媒体引擎
- 全面移除软件中的悲观锁,改用更现代的并发技术
- 升级内部数据库,支持连接池,并采用 MVCC 控制模式处理并发更新
- 吞吐量大幅提升(扫描包含 10 万个媒体的媒体库,耗时从约 40 分钟缩短至约 3 分钟)
- 浏览器中的 UI 渲染速度大幅提升,尤其适用于超大型播放列表
- 大多数操作都积极采用多线程和并行处理,包括但不限于:
- 媒体扫描引擎实现大规模并行化(媒体扫描速度提升约 8 倍)
- 通过 fork-join 池,以异步或并行方式处理各种其他场景
- 使用 WebSocket 与 Web 客户端通信,取代轮询
- 资源占用更低,交互也更加动态
- 客户端不再需要每 10 秒重复执行同一命令来检查状态
- 发生变化时,服务器会在需要时主动推送状态更新
- Web 客户端可以立即更新 UI,实现实时视图
- 移除 DWR——这项使用了 10 年的 Web 客户端与服务器通信技术
- 提供状态指示器,显示客户端是否已连接到服务器
- UI:
- 符合 HTML5 规范
- 重新设计布局:使用 iframe 取代 frameset 和 frame
- 使用专用库 DataTables 渲染表格
- 通过延迟渲染和在 DOM 外处理数据,大幅提升渲染速度(约提升 10 到 800 倍!)
- 表格越大,性能提升越明显
- 原本在浏览器中需要约 800 秒才能渲染的播放队列,现在不到 1 秒即可完成
- 支持在表格中启用可选分页和无障碍搜索
- 通过延迟渲染和在 DOM 外处理数据,大幅提升渲染速度(约提升 10 到 800 倍!)
- 可自定义生成的封面缩略图质量
- 支持在播放列表、播放队列和文件浏览模式中显示更多曲目字段
- 可选择显示曲目字段的表头
- 支持在浏览模式下对曲目排序(例如优先显示最近扫描的文件等)
- 支持在播放队列和媒体浏览器中批量加星或取消加星
- 状态图表改为使用 JS 库在客户端渲染,不再由服务器生成
- 符合 HTML5 规范
- Bug 修复:
- 修复多个竞态条件问题
- 完善一致性检查并重构相关代码
- 修正文档错误
- 其他改进
- 支持 JDK17
- 使用 JSR 310(Java time)替代旧版 Java 时间相关包来处理时间和时长
- 使用 Java NIO 替代旧版 IO 包处理文件
- 歌曲时长计算更加精确
- 支持通过环境变量或系统变量传入配置。修改偏好设置时,可以但不必编辑
airsonic.properties - 支持使用自定义 URL 向 ListenBrainz 服务器提交 scrobble 数据
- Web 客户端的播放队列支持“单曲循环”
- 支持 Sonos:查看文档
- 支持 Chromecast:查看详情
- 支持上传到指定文件夹(通过
UploadsFolder属性或参数设置) - 支持同时上传多个文件
- 支持上传并解压更多格式的压缩包:
- rar
- 7z
- tar
- 支持将 Podcast 导出为 OPML
- 支持导入使用相对文件路径的播放列表(相对于 Playlists 文件夹解析)
- 支持直接使用二进制互联网电台流 URL
- 支持为内容归类多个流派
- 支持指定自定义日志文件位置(通过
logging.file.name属性或参数设置) - 支持自动书签和书签管理
- 支持手动或按计划备份内部数据库,并可指定保留的备份数量
- 支持在不同安装实例和数据库之间导出、导入数据
- 测试
- 进行了多项修复,以兼容各种外部数据库
- 针对外部数据库执行自动化测试
- Postgres
- MySQL
- MariaDB
- 集成测试改用 failsafe,不再使用 cucumber
- 构建与部署
- 更新 Docker 镜像,基础层改用 JRE 14。
- 新增 XMP 支持,从而开箱即用地播放 MOD 文件
- 支持多平台构建,包括 ARM v7 和 ARM64
- 构建流水线更加完善,支持自动发布,并可在合并代码时自动部署
- 功能或改进合并后,用户无需从源代码编译即可立即获取最新构建版本,不必等到可能相隔数月的下一个稳定版
- 同时发布到 GHCR 和 Docker Hub
- 更新 Docker 镜像,基础层改用 JRE 14。
- 功能移除
- 由于第三方库未及时适配新版 JVM,Java Jukebox 已被移除。详情请参阅 PR #636。
用于改进 Airsonic 的完整 PR 列表可在 PR 页面查看。未来将加入自动生成变更日志的功能,方便持续跟踪。
Airsonic-Advanced 偶尔会回移基础 Airsonic 分支中引入的功能,但总体而言,它比 Airsonic 更现代,也更偏向采用前沿特性。
使用方法
Airsonic-Advanced v10.6.x 系列及其快照版与原版 Airsonic 10.6.x 系列相互兼容。但 11.x 版本未必如此。
另外请注意,Airsonic-Advanced 11.x 及其快照版属于破坏性(不向后兼容)的版本变更。升级后将无法恢复到 10.6.x(系统确实会备份数据库,以备需要回退时使用,但必须手动恢复)。
Airsonic-Advanced 的快照版通常相当稳定,推荐优先使用;稳定版可能已经严重过时。
独立二进制文件
可从 GitHub 下载 Airsonic-Advanced。
可使用公钥验证发行版签名。
10.6.x 系列至少需要 Java Runtime Environment(JRE)1.8;11.x 及更高版本(包括快照版)至少需要 Java 11。
- 10.6.x 版本 → Java 8
- 11.x 及更高版本 → Java 11
Airsonic-Advanced 的运行方式与原版 Airsonic 基本相同,也可以替代原版 Airsonic。
请阅读兼容性说明。
Docker
Docker 镜像发布在 DockerHub 和 GHCR。近期发布的 Docker 镜像支持多平台,这意味着 DockerHub 也提供 ARMv7 和 ARM64 镜像。不过,目前 CI/CD 流程尚未对这些架构进行自动化测试,仅测试了 Linux 平台。
请注意,Docker 镜像的卷挂载路径已发生变化,与 Airsonic 不同。Airsonic 在容器内使用 /airsonic/* 作为挂载路径。Airsonic-Advanced 则尽量使用默认 war 镜像在 /var/* 下的路径,以便用户在容器和非容器环境之间切换时保持一致。
Music:/airsonic/music→Music:/var/musicPodcasts:/airsonic/podcast→Podcasts:/var/podcastPlaylists:/airsonic/playlists→Playlists:/var/playlists/airsonic/data→/var/airsonic
还请注意,Docker 镜像默认会以 root 用户(0)和 root 组(0)运行,因此外部卷中创建的文件也会归 root 所有。你可以通过以下两种方式之一修改容器内进程的运行用户:
- 执行
docker run命令时指定--user,并以uid:gid格式提供其中一个或两个值 - 执行命令时,为容器镜像指定
PUID或PGID环境变量