Skip to content

milestone 2.0.0 - #77

Open
flier268 wants to merge 243 commits into
masterfrom
milestone-2.0.0
Open

flier268 wants to merge 243 commits into
masterfrom
milestone-2.0.0

Conversation

@flier268

@flier268 flier268 commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner

此 PR 取代 #73(#73 在 migrate-to-nodejs 改名為 milestone-2.0.0 時被 GitHub 自動關閉)。

ConvertZZ 2.0.0

自 1.0.0.8(WPF/Windows 限定)起的第一個公開預發行版。

2.0 以 Vue 3、Element Plus、Tauri 2 與 Rust 轉換核心重寫,正式支援 Windows x64 與 Linux x64。

這是預發行版,供測試與回饋。正式版前行為與安裝流程仍可能調整。

使用者不需要另外安裝 Node.js、FFmpeg 或 TagLib。

相較 1.0.0.8 的主要變化

架構與平台

  • 由單一 Windows WPF 應用改為跨平台桌面程式;轉換核心與桌面層同程序,發行包不含外部 Node.js 執行檔。
  • Linux 可使用 AppImage、DEB、RPM;乾淨環境不需建置用 *-dev 套件即可執行。
  • 保留單一執行個體、系統托盤、獨立浮動球、全域快捷鍵與舊版命令列語意。

轉換引擎

  • 預設引擎改為新式分詞(ws-segment-rs + cjk-convert-rs);簡轉繁會做同義詞最佳化。
  • 舊版字典仍讀取 UTF-8 BOM 六欄 Dictionary.csv,保留啟用欄位、優先權、長詞優先與 9999 保護詞。
  • ZhConvert 改呼叫官方 /convert,快取 /service-info 二十四小時;網路失敗時不會自動切換引擎。
  • 空白、換行、標點與未知片段盡量保持原位;長文會在安全邊界分段。

檔案與寫入安全(刻意與舊版不同)

  • 檔案內容、檔名與音訊標籤作業都會先預覽,確認後才寫入。
  • 檔名衝突預設略過;覆寫需額外確認。
  • 內容先寫入同目錄暫存檔,驗證成功後才取代;檔名採兩階段重新命名,失敗時嘗試回復。
  • 遞迴處理不跟隨符號連結。
  • 轉換前預設建立 .bak 備份(可用設定或 /b:f 關閉)。
  • 舊命令列參數大多相容,但不再提供無確認直接寫入。

音訊標籤

  • MP3:ID3v1/ID3v2.3/ID3v2.4(Rust id3);ID3v1 可修復 Big5/GBK 損壞文字。
  • APE:APEv2;OGG/OGA/Opus:Vorbis Comment(Rust lofty)。
  • 未選欄位、未知欄位、二進位欄位與封面不變;不會重新編碼音訊內容。
  • 離線即可掃描 APE/OGG,不在執行時下載 WASM。

設定與字典

  • 首次發現舊版 ConvertZZ.json 會詢問;同意後只讀取並另存為 2.0 設定,不修改來源。
  • 儲存 Dictionary.csv 前會詢問,並先建立不覆蓋的時間戳備份。

自動更新

  • Windows 安裝程式與 Linux AppImage 支援應用程式內更新,並以 minisign 公鑰驗證。
  • DEB/RPM 不會就地覆寫;檢查更新時會改開啟 GitHub Releases。
  • 預設只檢查正式版;設定中可開啟「檢查開發/預發佈版本」才會看到本 beta。

已知限制與平台差異

  • Linux Wayland:全域快捷鍵與自動複製貼上於本版停用;浮動球置頂依合成器能力而定。
  • Linux 托盤通常需要 AppIndicator/StatusNotifier;缺少時主視窗仍可使用。Tauri 在 Linux 不提供托盤左鍵事件,請用選單開啟主視窗。
  • ZhConvert API 金鑰優先存入作業系統憑證庫;Linux 缺少 Secret Service 時只保留於目前工作階段。
  • 少數字形結果可能與舊版 Windows LCMapStringEx 不同。
  • 編碼工具改為明確指定編碼,不再跟隨舊版 Encoding.Default 系統碼頁。

回報問題

請到 GitHub Issues,並附上作業系統、桌面環境(X11/Wayland)、安裝格式與重現步驟。

合併後自動關閉 #76

移除硬編碼的雙擊轉繁與右鍵轉簡。左鍵無輔助鍵只拖曳,輔助鍵加點擊執行設定動作,右鍵開啟與舊版相同的選單。
托盤改列與舊懸浮球相同的轉換、工具與視窗項目,並一律送出 app://legacy-action。同步修正 AppImage 驗收測試字串。
更新已取得證據的項目狀態,並寫入 2026-08-14 的本機驗收紀錄。
開發與 CI 改用 ffmpeg-static 與 tests/fixtures,不再下載遠端樣本或依賴系統 ffmpeg。
該 ffmpeg 不打進發行包。
驗收人已確認關於頁會開啟 GitHub Issues 與 Releases。
主視窗預設不可見。設定新增「啟動時顯示主視窗」,命令列參數或發現更新時仍會顯示。
設定頁快捷鍵欄位改為唯讀並攔截鍵盤事件,不再讓使用者手打加速鍵字串。
首次開啟會顯示系統導覽,其中一步詢問是否匯入 ConvertZZ.json。設定頁移除此匯入按鈕,關於頁可重看導覽。
移除設定頁頂部儲存按鈕。有未儲存變更時,改在畫面底部顯示提示與儲存按鈕。
啟動時先隱藏主視窗與懸浮球,定位後再顯示。
轉換完成改為獨立 Toast,顯示在游標附近,不再裁切於懸浮球內。
補上 ID3v1 Big5/GBK、多值標籤、設定備份失敗與四種音訊副檔名案例,並更新對應驗收狀態。
以 QEMU 安裝 DEB,確認沒有 Node.js 與開發套件,並離線掃描 APE/OGG。映像優先從台灣鏡像下載。
依 test:qemu 通過結果,將 B-03、I-09、J-09、J-10、J-13 標為已通過。
視窗背景改為透明,球體填滿視窗,並停用文字選取。
保留襯線 Z 與上標 2,配色改為 2.0 青綠。懸浮球、側邊欄與關於頁共用同一份路徑圖示,避免字型把 2 畫成 z,並把浮動視窗鎖回 72×72。
存檔與 commit 前會執行 rustfmt 與 Prettier,並套用現有原始碼格式。
Vue Test Utils 的 get() 會省略 exists,導致 vue-tsc 失敗。
將套件管理員改為 pnpm 11,build script 設定改到 pnpm-workspace.yaml。
TypeScript 升到 6.0.3,並依官方建議移除已棄用的 baseUrl。
補上目錄責任、層級邊界與套件更新方式,供後續代理依專案慣例修改。
讓 CI 與 Release 使用 pnpm/action-setup@v6,不再寫死 10.26.1。
依 ID3 標頭擷取 MP3 音訊,讓 2.3/UTF-16 寫回通過驗證。
建立 SettingsV2 驗收表,並在備份失敗時顯示錯誤且不覆寫設定。
以本機正式建置驗證 /file 預覽、APE/OGG 標籤畫面、浮動球拖動與關閉後仍留在背景。
去掉結尾 .app,避免與 macOS 套件副檔名衝突,並同步憑證庫服務名稱。
Windows 安裝程式與 Linux AppImage 會先確認再下載安裝。
發行工作流程會簽署產物並產生 latest.json。
DEB 與 RPM 仍改開啟 GitHub Releases。
舊版 ConvertZZ.json 本來就不會被改寫,結果會另存為 2.0 設定。
關閉 store 自動存檔,載入時先重讀磁碟。浮動球移動改走 patchSavedSettings,避免用過期記憶體覆寫快捷鍵。
只註冊已啟用且有組合鍵的項目;已填但未啟用時提出警告。錯誤改走應用程式通知。
封面等非文字框不再計入 ID3v2 隱藏欄位數。
invalidate 會讓進行中的 run 失去世代,finally 因此略過 onSettled。以進行中輪數歸零且不在套用中作為仍要 settle 的條件。
run() 只在開頭看 applying。onStart 之後才進入套用時,仍會取消進行中的寫入。取消前再查一次,套用中就返回。
選取檔案應立即建立標籤預覽、畫面不得再有建立預覽按鈕,
重新建立預覽應為重新載入,加入檔案要合併去重並保留勾選,
套用中選取按鈕停用且不得取消 audio.apply。
拿掉建立預覽按鈕,重新建立預覽改為重新載入。
已有預覽時仍可選取檔案或資料夾,路徑去重後合併並更新預覽,
勾選與欄位勾選沿用既有項目。套用中停用選取,避免取消寫入。
合併掃描結果時,同一路徑的不同寫法不再變成兩筆。
重新掃描不再把點擊事件當成路徑。掃描進行中再加入檔案會重掃全部路徑。停止或失敗後不建立預覽。未聚焦時副標顯示路徑數與全部檔案數,聚焦資料夾時含子目錄。欄位鍵重產後仍依標籤還原勾選。
完整掃描先留下勾選再清清單;被取代的掃描先換代次,避免已取消訊息與忙碌狀態閃斷。重複標籤名不拿來互相還原。UNC 與 \\?\ 路徑鍵不分大小寫,副標筆數與預覽保留名單都改走路徑鍵。
音訊頁只留欄位表。規則抽屜只提供合併與移除,不再出現複製動作、舊播放器複製範本或並排欄選單。後端 TagAction::Copy 仍保留。
規則只剩移除與合併。後端不再接受 copy,合併未指定衝突時一律只補空白。
@flier268

Copy link
Copy Markdown
Owner Author

本次推送 0300243..c6a910f(86 個 commit),主要是音訊標籤頁:

  • 重新設計:依資料夾分組、可收合的單一虛擬清單;統計條即篩選;全選包含收合資料夾內的檔案。
  • 即時預覽:選取檔案或資料夾就自動建立預覽,移除「建立標籤預覽」按鈕與預覽狀態;可隨時追加檔案,勾選會保留;「重新建立預覽」改為「重新載入」。
  • 標籤操作:抽屜規則支援合併與移除(合併未指定衝突策略時只補空白欄位)、清理多餘標籤。
  • 移除:並排標籤欄、切換開關與複製標籤功能(含後端 copy),本頁先專注於標籤的編碼轉換。
  • 修正:徵求2.0.0-beta9使用上遇到的問題或改進建議 #76 yt-dlp MP3 相關問題、掃描/預覽競態、路徑正規化、轉換設定抽屜版面。

測試:cargo 350、Vitest 362、e2e 39 全過。

beta9 與 beta10 整段文字比較時,beta9 會被看成較新。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant