Skip to content

ter-music v2.1.0

Latest

Choose a tag to compare

@YXZL985 YXZL985 released this 01 Aug 14:37

Ter-Music v2.1.0 Release Notes

Release Date: 2026-08-01
Tag: v2.1.0 (5038c86)
Since: v2.0.0 (880031a) — 51 commits


What's New

  • Internationalization: complete i18n engine with XML language packs, in-app language switcher, and ~600 UI strings migrated to translation keys; tar.gz language pack distribution for community contributors
  • Equalizer presets: 9 built-in EQ presets (Pop, Rock, Jazz, Classical, etc.) with soft-clip protection
  • Lyrics improvements: switch between embedded ID3 lyrics and external .lrc files; timestamp strip fix
  • Tree view: browse your library by artist/album directory hierarchy, coexisting with sort modes
  • Recursive library scan with incremental tracking and performance tuning
  • Graceful shutdown on SIGHUP/SIGTERM/SIGINT
  • Packaging: Docker-based builds for DEB/RPM/Linyaps/AppImage/Portable, Arch AUR support (ter-music-cn), verified on Ubuntu 20.04–26.04, Debian 10–13, Rocky 8–9
  • Stability: fixes for playback stops, memory exhaustion in album art rendering, and MPRIS screen pollution

Summary of Changes by File

New Files (7 files, +2712 lines)

File Lines Purpose
data/lang/en_US.xml +568 English language pack (all i18n translation keys)
data/lang/zh_CN.xml +568 Chinese language pack (all i18n translation keys)
include/org.yxzl.ter-music/i18n/i18n.h +122 i18n translation engine public API
src/org.yxzl.ter-music/i18n/i18n.c +851 i18n translation engine implementation (XML parser, key lookup, tar.gz loader)
src/org.yxzl.ter-music/ui/language_view.c +288 Dedicated language selection UI view (scrollable, right-aligned)
scripts/docker/Dockerfile.uab +63 Docker image for Linyaps UAB build environment (Debian 13 + linglong toolchain)
scripts/docker/docker-build.sh +252 Unified Docker build wrapper (image management, privileged modes, post-container chown)

Removed Files (5 files, -644 lines)

File Lines Reason
cmake/toolchain-aarch64-linux-gnu.cmake -34 Cross-compilation dropped; OBS handles non-x86
scripts/cross-compile/Dockerfile -103 Replaced by per-format Dockerfiles under scripts/docker/
scripts/cross-compile/cross-build.sh -174 Moved → scripts/docker/docker-build.sh (renamed + rewritten)
scripts/cross-compile/docker-compose.yml -17 No longer needed
scripts/README.md -316 Consolidated into docs/BUILD_GUIDE.md

Renamed / Moved (5 files)

Old Path New Path
scripts/cross-compile/Dockerfile.deb-static scripts/docker/Dockerfile.deb-static
scripts/cross-compile/Dockerfile.rpm scripts/docker/Dockerfile.rpm
scripts/cross-compile/Dockerfile.rpm-static scripts/docker/Dockerfile.rpm-static
scripts/cross-compile/cross-build.sh scripts/docker/docker-build.sh
data/help/help-quickstart-{zh,en}.txt data/help/help-quickstart-{zh_CN,en_US}.txt

Core Source Files Modified (~60 files)

i18n migration (17 files): main/main.c, audio/audio.c, audio/backend_ops.c, audio/backend/pipewire.c, audio/playback_thread.c, audio/play_queue.c, playlist/playlist.c, search/search.c, ui/ui.c, ui/utf8.c, ui/controls.c, ui/dialog.c, ui/menus.c, ui/settings.c, ui/history.c, ui/layout.c, ui/util.c, ui/help_view.c, ui/playlist_view.c, ui/playlist_render.c, ui/info_view.c, ui/mouse.c, ui/favorites.c — all hardcoded strings replaced with i18n_get() key lookups.

Playback fixes (5 files): audio/playback_thread.c (segment pool end-of-stream + CUE offset interact), audio/segment_buffer.c, audio/audio.c (MPRIS screen pollution), audio/equalizer.c (EQ presets + soft-clip)

UI features (8 files): ui/lyrics.c (embedded/external switch, timestamp strip, cursor reset), ui/braille/braille_art.c + ui/braille/image_loader.c (memory exhaustion guard), ui/settings.c (EQ preset popup + settings refactor), ui/language_view.c (new), ui/scrollbar.c (lyrics overflow fix), ui/controls.c (tree view + hotkey fix)

Library / scanning (2 files): library/library.c, library/browser/browser.c (recursive scan, incremental tracking, performance tuning)

Signal handling (2 files): main/main.c, ui/ui.c (graceful exit on SIGHUP/SIGTERM/SIGINT)

Build / packaging (12 files): scripts/build/build-{deb,rpm,linyaps,appimage,portable}.sh, scripts/build/launch-auto-build.sh, scripts/docker/{docker-build.sh,Dockerfile.{deb-static,rpm,rpm-static,uab}}, .gitignore, PKGBUILD, .SRCINFO, debian/control, debian/rules

Version / metadata (6 files): include/org.yxzl.ter-music/types.h (APP_VERSION → v2.1.0), debian/copyright, debian/changelog, PKGBUILD, .SRCINFO

Documentation (8 files): docs/{BUILD_GUIDE.md,README.md}, docs/translations/README_zh-CN_{Legacy,Modern}.md, data/help/help-quickstart-{zh_CN,en_US}.txt


Commit History with File Changes

Commit Date Summary Files Changed
5038c86 Aug 01 fix(aur): PKGBUILD static pkgver, tag-based source, ncurses sed fix, i18n/icons/desktop install, optdepends, GPL-3.0, regenerate .SRCINFO PKGBUILD, .SRCINFO
ad42239 Aug 01 fix(build): clean old .uab and .layer artifacts before each linyaps build scripts/build/launch-auto-build.sh
7ace7ce Aug 01 fix(build): export UAB and layer independently (UAB mandatory, no fallback); fix root-owned artifacts via chown→chmod fallback across all 5 builders build-{appimage,deb,linyaps,portable,rpm}.sh
7b81f6f Aug 01 feat(build): ostree pull uab-header/uab-loader/mkfs.erofs in Dockerfile.uab; --tmpfs /tmp:exec for nested overlay; LINGLONG_CONNECT_TIMEOUT=120; post-container chown safety net Dockerfile.uab, docker-build.sh, .gitignore
f9ed48a Jul 30 fix(build): add -y flag to yum/dnf installs; apt --no-install-recommends; pipefail guards Dockerfile.{deb-static,rpm,rpm-static,uab}
d20585b Jul 29 fix(build): upgrade FFmpeg 5→7 in deb-static+rpm-static; multiarch lib paths (/usr/lib/${triplet}) Dockerfile.{deb-static,rpm-static}, debian/rules
867a32a Jul 28 fix(build): suppressed compiler warnings (-Wno-format-truncation etc), guarded rsync against root-owned temp, set -e robustness build-{appimage,deb,linyaps,portable,rpm}.sh, debian/rules
ad1afaa Jul 28 fix(audio): memcpy replaces strncpy in audio.c to silence GCC -Wstringop-overflow src/.../audio/audio.c
82e015a Jul 27 fix(docker-build): -b flag rebuilds all 4 images with --no-cache; DOCKER_CONFIG writable location scripts/docker/docker-build.sh
e5b6be8 Jul 27 refactor(build): rename cross-compile→docker; remove multi-arch conditionals; strip 400+ lines of dead code 12 files (all build scripts, Dockerfiles, docs)
9dd4d08 Jul 27 fix(ui): lyrics overflow pushed scrollbar off screen → clamp to viewport bounds src/.../ui/lyrics.c, src/.../ui/scrollbar.c
8610260 Jul 27 fix: echo→printf format safety; increased xvfb-run --auto-servernum for rpm build build-deb.sh, build-rpm.sh, ui/help_view.c
23c3f50 Jul 27 docs: update BUILD_GUIDE for Docker-based linyaps; remove obsolete scripts/README.md BUILD_GUIDE.md, README.md, 4 README translations
dd69116 Jul 27 feat(linyaps): containerized build mode via docker-build.sh with -p flag; propagate --keep-temp build-linyaps.sh, launch-auto-build.sh
115def6 Jul 27 feat(linyaps): add Dockerfile.uab (Debian 13 + linglong/linyaps 1.13.8); cross-build.sh privileged support Dockerfile.uab, cross-build.sh, .gitignore
240b1f4 Jul 26 fix(build): add zlib to Dockerfile.{deb-static,rpm,rpm-static}; remove obsolete Dockerfile and docker-compose.yml 6 files (Dockerfiles, compose, build scripts)
ef99f2e Jul 26 refactor(build): remove cross-compilation entirely (~1100 lines); add zlib+sqlite3 deps; update AUR+docs 16 files (all build scripts, Dockerfiles, docs, AUR)
ef504f0 Jul 26 chore: bump version to v2.1.0; update developer name to "Yanxi Bamboo Forest" and repo URL 17 files (types.h, debian/, PKGBUILD, docs, scripts)
9c61e9f Jul 26 fix: built-in language guard prevents crash when lang pack absent; fix doc section numbering i18n/i18n.c, 2 README files
0d6c616 Jul 26 docs: add tar.gz language pack distribution specification (naming, structure, url scheme) 3 README files
ffd61d9 Jul 26 docs(fix): correct lyrics shortcut (D→Ctrl+L) and typo in Legacy readme README_zh-CN_Legacy.md
ad6188b Jul 26 docs: update all docs for v2.0.0+ features (i18n, EQ presets, lyrics switch, recursive scan, signals) 5 files (READMEs + help quickstart)
195c1d3 Jul 26 fix(playback): segment pool end-of-stream bug causing random playback stop; .gitignore update audio/playback_thread.c, .gitignore
a724c97 Jul 25 feat(i18n): help-text file check included in language coverage % calculation i18n/i18n.c
fec0703 Jul 25 fix(i18n): help.txt path mismatch between install script and help_view.c read path i18n/i18n.c
2449539 Jul 25 feat(equalizer): 9 EQ presets (Pop/Rock/Jazz/etc), soft-clip limiter, preset popup menu in settings audio/equalizer.{c,h}, ui/settings.c, both lang packs
614b12d Jul 25 fix(lyrics): reset cursor mode on lyrics reload; cursor_index fallback to 0 ui/lyrics.c, ui/ui.c, README_zh-CN_Legacy.md
c60eafd Jul 25 fix(lyrics): strip embedded LRC timestamps during copy to prevent partial tag fragments at end of file ui/lyrics.c
d6f414b Jul 25 feat(lyrics): switch between embedded (ID3) and external .lrc file from the lyrics view 9 files (lyrics, library, audio, types, lang packs)
00e1629 Jul 25 fix(i18n): lyric seek hotkey D→Ctrl+L (D was conflicting with delete); update all docs 9 files (help, lang packs, docs, controls, layout, settings)
ae1e003 Jul 24 fix(signal): install SIGTERM/SIGINT/SIGHUP handlers; stop audio on exit instead of leaving orphan main/main.c, ui/ui.c
7354d83 Jul 24 feat(library): recursive directory scanning with depth limit; performance tuning; incremental file tracking library/library.c, library/browser/browser.c
d0db943 Jul 24 feat(i18n): migrate all ~40 remaining hardcoded zh_CN/en ternary branches to i18n_get() 17 files (audio, backend, playlist, ui, main)
a4048ad Jul 24 feat(i18n): tar.gz language pack system (load/save/list); reorganize help/ under data/; expand i18n.c to 503 lines i18n/i18n.{c,h}, ui/help_view.c, CMakeLists.txt, data files
04f9cd2 Jul 23 refactor(settings): remove Language and Volume UI options (delegated to language_view + system mixer); ~107 lines removed ui/settings.c, .gitignore
9690d4c Jul 21 i18n: sync language pack XML keys with latest source code state (add/rename/remove keys) data/lang/{en_US,zh_CN}.xml
503d353 Jul 15 i18n: add newly-introduced UI keys to both language packs data/lang/{en_US,zh_CN}.xml
cec845f Jul 15 fix: settings option keys aligned with language pack XML; all labels routed through i18n_get() ui/settings.c
b848c3b Jul 15 fix: control bar labels, menu titles use i18n; ui_lang switching triggers full screen refresh ui/controls.c, ui/menus.c, ui/ui.c, ui/language_view.c
4c91778 Jul 15 fix(sidebar): language sidebar item names resolved through i18n_get() instead of hardcoded strings ui/util.c
19363ea Jul 15 fix(lang_view): language selection view right-aligned; scrollbar module integrated for long language lists ui/language_view.c
115dc4b Jul 15 fix(i18n): missing language_sidebar_items array definition in util.c (compile fix) ui/util.c
5be3fb4 Jul 15 fix(i18n): change ui_language from int to char[32] to store locale codes; update config read/write config/config.c, ui/menus.c, ui/settings.c
487f0b5 Jul 15 feat(ui): new language_view.c (275 lines): scrollable list, selection highlight, keyboard navigation 8 files (CMakeLists, lang_view, types, menus, lang packs)
92f8e28 Jul 15 feat(i18n): bulk migration — replace all direct printf/strcmp with i18n_get() calls across 22 files 22 files (all major UI and logic modules)
92b2105 Jul 15 feat(i18n): initial i18n engine: XML parser, key→value lookup, config schema for lang preference, data/lang/ packs 8 files (i18n.c/h, lang packs, types, config, main, CMakeLists)
a6d705e Jul 14 fix: album cover memory exhaustion (widthheightbpp > INT_MAX); png/jpeg size guard in image_loader; playlist null deref guard 4 files (braille_art, image_loader, playlist)
c9e9bfc Jul 14 feat(tree): directory tree view coexisting with sort (artist/album/track hierarchy); keyboard + mouse tree navigation 7 files (playlist, types, controls, mouse, playlist_render, ui)
5f682bb Jul 13 fix(ui): MPRIS dbus events triggered screen repaint in non-main views (pollution) audio/audio.c
ce6d1a0 Jul 13 fix(audio): CUE file offset interacting with segment preload pool causing skip-back; buffer underrun guard audio/playback_thread.c, audio/segment_buffer.c
b5d2707 Jul 13 fix(ui): transparent background for braille art and visualizer; clamp album art to terminal width; config schema migration framework 13 files (ui/*, config, controls, layout, progress, settings, types, util, visualizer)

Artifact List (build/release/)

File Size Format Target
ter-music_2.1.0-1_amd64.deb 5.8 MB Debian binary (.deb) Ubuntu 20.04-26.04, Debian 10-13
ter-music_2.1.0-1.debian.tar.xz 2.4 KB XZ (debian/ directory) Source packaging
ter-music_2.1.0-1.dsc 1.2 KB Debian Source Control Source metadata
ter-music_2.1.0.orig.tar.gz 457 KB gzip source tarball Upstream source
ter-music-2.1.0-1.el8.src.rpm 384 KB RPM source EL8 rebuild
ter-music-2.1.0-1.el8.x86_64.rpm 1.9 MB RPM binary Rocky Linux 8/9 (RHEL compat)
ter-music-2.1.0-portable-x86_64.tar.gz 85 MB gzip tarball (bundled deps) Any glibc ≥2.28 Linux
ter-music-2.1.0-x86_64.AppImage 86 MB AppImage (SquashFS) Any glibc ≥2.28 Linux
org.yxzl.ter-music_2.1.0_x86_64.uab 48 MB Linyaps UAB (ELF stub + app data) Linyaps runtime
org.yxzl.ter-music_2.1.0.0_x86_64_binary.layer 54 MB Linyaps layer (archive) Linyaps runtime

Non-x86 Builds (OBS Server)

Non-x86 architectures (aarch64/arm64, loong64, sw64, mips64el) are built and maintained on the OBS (Open Build Service) server.
OBS Project: https://obs22.odata.cc/package/show/home:Admin:app/ter-music

Packages are rebuilt automatically from the same v2.1.0 source by the OBS infrastructure.


Compatibility Matrix

Package Type Target Distros Tested Status
DEB (amd64) Ubuntu 20.04/22.04/24.04/26.04 LTS All passed
DEB (amd64) Debian 10(buster)/11(bullseye)/12(bookworm)/13(trixie) All passed
RPM (x86_64) Rocky Linux 8/9 (RHEL 8/9 compat) All passed
Arch (x86_64) Arch Linux (latest, pacman 7.x) PKGBUILD verified
Linyaps (x86_64) Deepin / Linyaps 1.13+ UAB + layer
AppImage (x86_64) Universal Linux (glibc ≥2.28) SquashFS appimage
Portable (x86_64) Universal Linux (glibc ≥2.28) Bundled deps
OBS (arm64/loong64) OBS cross-builds Built automatically

Links


Ter-Music v2.1.0 发布说明

发布日期: 2026-08-01
标签: v2.1.0 (5038c86)
起始: v2.0.0 (880031a) — 51 个提交


更新摘要

  • 国际化 (i18n):完整的翻译引擎(XML 语言包)、应用内语言切换器、约 600 条 UI 字符串迁移为翻译键;支持 tar.gz 语言包分发,方便社区贡献翻译
  • 均衡器预设:内置 9 种 EQ 预设(流行、摇滚、爵士、古典等),带软限幅保护
  • 歌词改进:支持内嵌 ID3 歌词与外部 .lrc 文件间切换;修复时间戳剥离
  • 树状视图:按艺术家/专辑目录层次浏览曲库,与排序模式共存
  • 递归曲库扫描:增量跟踪与性能调优
  • 优雅退出:SIGHUP/SIGTERM/SIGINT 信号处理
  • 打包:Docker 化构建支持 DEB/RPM/Linyaps/AppImage/Portable,新增 Arch AUR 支持(ter-music-cn),已验证 Ubuntu 20.04–26.04、Debian 10–13、Rocky 8–9
  • 稳定性:修复随机停播、专辑封面渲染内存耗尽、MPRIS 屏幕污染等问题

按文件分组变更摘要

新增文件 (7 个, +2712 行)

文件 行数 用途
data/lang/en_US.xml +568 英文语言包(所有 i18n 翻译键值)
data/lang/zh_CN.xml +568 中文语言包(所有 i18n 翻译键值)
include/org.yxzl.ter-music/i18n/i18n.h +122 i18n 翻译引擎公开 API
src/org.yxzl.ter-music/i18n/i18n.c +851 i18n 翻译引擎实现(XML 解析、键值查找、tar.gz 加载)
src/org.yxzl.ter-music/ui/language_view.c +288 独立语言选择界面(可滚动、右对齐)
scripts/docker/Dockerfile.uab +63 Linyaps UAB 构建环境 Docker 镜像(Debian 13 + linglong 工具链)
scripts/docker/docker-build.sh +252 统一 Docker 构建封装(镜像管理、特权模式、容器后 chown)

删除文件 (5 个, -644 行)

文件 行数 原因
cmake/toolchain-aarch64-linux-gnu.cmake -34 交叉编译已移除,非 x86 交由 OBS 构建
scripts/cross-compile/Dockerfile -103 已按格式拆分为 scripts/docker/ 下独立 Dockerfile
scripts/cross-compile/cross-build.sh -174 重命名并重写 → scripts/docker/docker-build.sh
scripts/cross-compile/docker-compose.yml -17 不再需要
scripts/README.md -316 合并到 docs/BUILD_GUIDE.md

重命名 / 移动 (5 个文件)

旧路径 新路径
scripts/cross-compile/Dockerfile.deb-static scripts/docker/Dockerfile.deb-static
scripts/cross-compile/Dockerfile.rpm scripts/docker/Dockerfile.rpm
scripts/cross-compile/Dockerfile.rpm-static scripts/docker/Dockerfile.rpm-static
scripts/cross-compile/cross-build.sh scripts/docker/docker-build.sh
data/help/help-quickstart-{zh,en}.txt data/help/help-quickstart-{zh_CN,en_US}.txt

核心源码修改 (~60 个文件)

i18n 迁移 (17 个文件): main/main.c, audio/audio.c, audio/backend_ops.c, audio/backend/pipewire.c, audio/playback_thread.c, audio/play_queue.c, playlist/playlist.c, search/search.c, ui/ui.c, ui/utf8.c, ui/controls.c, ui/dialog.c, ui/menus.c, ui/settings.c, ui/history.c, ui/layout.c, ui/util.c, ui/help_view.c, ui/playlist_view.c, ui/playlist_render.c, ui/info_view.c, ui/mouse.c, ui/favorites.c — 所有硬编码字符串替换为 i18n_get() 键值查找

播放修复 (5 个文件): audio/playback_thread.c(段缓冲池流结束修复 + CUE 偏移交互), audio/segment_buffer.c, audio/audio.c(MPRIS 屏幕污染), audio/equalizer.c(EQ 预设 + 软限幅)

UI 特性 (8 个文件): ui/lyrics.c(内嵌/外部切换、时间戳剥离、光标重置), ui/braille/braille_art.c + ui/braille/image_loader.c(内存溢出防护), ui/settings.c(EQ 预设弹出菜单 + 设置重构), ui/language_view.c(新增), ui/scrollbar.c(歌词溢出修复), ui/controls.c(树视图 + 快捷键修正)

库扫描 (2 个文件): library/library.c, library/browser/browser.c(递归扫描、增量跟踪、性能调优)

信号处理 (2 个文件): main/main.c, ui/ui.c(SIGHUP/SIGTERM/SIGINT 优雅退出)

构建 / 打包 (12 个文件): scripts/build/build-{deb,rpm,linyaps,appimage,portable}.sh, scripts/build/launch-auto-build.sh, scripts/docker/{docker-build.sh,Dockerfile.{deb-static,rpm,rpm-static,uab}}, .gitignore, PKGBUILD, .SRCINFO, debian/control, debian/rules

版本 / 元数据 (6 个文件): include/org.yxzl.ter-music/types.h(APP_VERSION → v2.1.0), debian/copyright, debian/changelog, PKGBUILD, .SRCINFO

文档 (8 个文件): docs/{BUILD_GUIDE.md,README.md}, docs/translations/README_zh-CN_{Legacy,Modern}.md, data/help/help-quickstart-{zh_CN,en_US}.txt


构建产物 (build/release/)

文件 大小 格式 目标
ter-music_2.1.0-1_amd64.deb 5.8 MB Debian 二进制包 (.deb) Ubuntu 20.04-26.04, Debian 10-13
ter-music_2.1.0-1.debian.tar.xz 2.4 KB XZ 压缩 (debian/ 目录) 源码打包
ter-music_2.1.0-1.dsc 1.2 KB Debian Source Control 源码元数据
ter-music_2.1.0.orig.tar.gz 457 KB gzip 源码包 上游源码
ter-music-2.1.0-1.el8.src.rpm 384 KB RPM 源码包 EL8 重编译
ter-music-2.1.0-1.el8.x86_64.rpm 1.9 MB RPM 二进制包 Rocky Linux 8/9 (RHEL 兼容)
ter-music-2.1.0-portable-x86_64.tar.gz 85 MB gzip 可移植包 (自带依赖) 任意 glibc ≥2.28 Linux
ter-music-2.1.0-x86_64.AppImage 86 MB AppImage (SquashFS) 任意 glibc ≥2.28 Linux
org.yxzl.ter-music_2.1.0_x86_64.uab 48 MB Linyaps UAB (ELF 头部 + 应用数据) Linyaps 运行时
org.yxzl.ter-music_2.1.0.0_x86_64_binary.layer 54 MB Linyaps layer (归档) Linyaps 运行时

非 x86 构建 (OBS 服务器)

非 x86 架构(aarch64/arm64、loong64、sw64、mips64el)的软件包在 OBS(Open Build Service)服务器上构建和维护。
OBS 项目: https://obs22.odata.cc/package/show/home:Admin:app/ter-music

软件包从相同的 v2.1.0 源码由 OBS 基础设施自动重编译。


兼容性矩阵

包类型 目标发行版 测试状态
DEB (amd64) Ubuntu 20.04/22.04/24.04/26.04 LTS ✅ 全部通过
DEB (amd64) Debian 10(buster)/11(bullseye)/12(bookworm)/13(trixie) ✅ 全部通过
RPM (x86_64) Rocky Linux 8/9 (RHEL 8/9 兼容) ✅ 全部通过
Arch (x86_64) Arch Linux (最新, pacman 7.x) ✅ PKGBUILD 验证通过
Linyaps (x86_64) Deepin / Linyaps 1.13+ ✅ UAB + layer
AppImage (x86_64) 通用 Linux (glibc ≥2.28) ✅ SquashFS appimage
Portable (x86_64) 通用 Linux (glibc ≥2.28) ✅ 自带依赖
OBS (arm64/loong64) OBS 交叉构建 ⬚ 自动构建

链接