Releases: yinanli1917-cloud/AM-MiniPlayer
nanoPod v2.5
What's New
Skip Next/Previous Micro-Interactions
- Two
play.fillSF Symbols per button with replacement flow animation (exit → snap → enter) - Per-triangle stagger (60ms) with scaleX squish during movement
- Press feedback: scale 0.85 with spring bounce
Track Change Transitions
- Title and artist slide in with directional blur + fade on skip
- Direction-aware: skip-next slides from right, skip-prev from left
- Applied to both album page and playlist "Now Playing" card
Shuffle & Repeat Button Animations
- Shuffle: SF Symbol with replacement flow on toggle
- Repeat: rotation + scale pulse with
.symbolEffect(.replace)for icon morphing - Capsule press feedback on playlist page buttons
Lyrics Pipeline Improvements
- Fix stale and mismatched lyrics selection
- Prefer Apple artwork source with hardened fixtures
- New disk cache tests
Performance
- Removed
.blur()from all button keyframe animators to reduce CPU overhead during lyrics pipeline
Install
Download nanoPod-v2.5.zip, unzip, move to Applications.
SHA-256: 77e8ee9a94759f1b7773e52d5b1c44549461bdda56c25a6478a7c41e002e5dd4
v2.3 — Lyrics Pipeline Hardening
Lyrics Pipeline
Speed
- P50 latency: 2.9s → 2.7s — 1.5s aggressive early exit for high-confidence results, HTTP connection pool doubled (6→12), per-source timeouts tightened (10s→4s), single retry on transient errors, connection pre-warming on app init
Accuracy
- Predefined tests: 50/54 → 52/54, zero regressions
- Catalog version threshold rebalanced — fixes "女爵" (杨乃文) rejection while still blocking wrong-version timing
- Quality scoring capped — moderate violations no longer zero out the quality component
- Completeness gate — sources with >45s internal gaps lose to more complete competitors
- Encoding corruption detection — rejects lyrics with >5% U+FFFD replacement characters
- Translation leak fix — catches additional KO+ZH and JA+ZH embedding formats from NetEase
- Identity consensus strengthened — graduated timeline rejection, independent agreement override
- Artist-discography fallback recovery — catches songs missed by primary search keywords
- 51/54 test cases now verify actual lyric content (firstLineContains)
Structural
- LyricsFetcher.swift decomposed: 2,636 → 412 lines (split into 4 files)
- TranslationService merged into LyricsService
- NSImage+AverageColor moved to Utils/
- Dead code removed: FloatingPanel, FloatingWindowModifier (158 lines)
- Services/ folder: 10 → 8 files
Artwork
- Restored instant artwork cache hits for rapid track switching
v2.2
What's New
Lyrics Matching Hardening
- Cross-source identity oracle — rejects lyrics when independent sources disagree
- Unsynced fallback — verified plain-text lyrics display instead of empty state
- Tail gap penalty catches wrong-version matches
- Japanese romaji detection hardened, localized version markers filtered
Artwork Matching Overhaul
- Unified scoring with reliability gate across all 4 sources
- Apple sources prioritized over web sources
Bug Fixes
- Fixed version display always showing "1.0" — source Info.plist now synced with build
- 145 unit tests passing
nanoPod v2.1 — menu bar self-heal + seamless auto-update
Highlights
Menu bar self-heal. Ports the macOS 26 ControlCenter cleanup to Swift so it runs on every user's Mac at launch — not just the developer's. Fixes the status item landing at x=-1 (off-screen, bottom-left) for users who had previously installed the old MusicMiniPlayer bundle, or whose ControlCenter database picked up stale menuItemLocations. Idempotent: only restarts ControlCenter when entries were actually modified.
Seamless auto-update. Silent background check against GitHub Releases 5s after launch. Newer tag triggers SHA256-verified download and bundle staging; the actual swap happens on next quit via a detached shell script that mv's, re-signs, and relaunches. No prompts, no buttons — from 2.1 onward, users get every future release automatically.
Verification
- 124 unit tests, 0 failures (includes real end-to-end bash bundle swap in
UpdateApplierTests) - Live GitHub Releases API round-trip confirmed against v2.0.0: tag format, asset shape, SHA256 file format all verified
- Fresh 2.1 build launched cleanly, updater correctly resolved
.upToDate(no accidental self-downgrade against v2.0.0)
Install
- Download
nanoPod-2.1-20260420-9a4d072.zip - Unzip and drag
nanoPod.appinto/Applications - First launch: right-click → Open (locally signed, not notarized)
- Grant Music + Apple Events permissions when asked
SHA256: 50364ea120b7309715e3d1d27c9563a6c66de0bc6ca03e98e6098b42ce58a4f2
From this release forward, updates flow silently — no more manual installs.
Requirements
- macOS 14 (Sonoma) or later — designed for macOS 26 Liquid Glass
- Music.app + Apple Music subscription (or local library)
- Apple Silicon or Intel Mac
nanoPod v2.0.0 — cross-region lyric aliasing fix
First public-friendly release. macOS 14+, Apple Silicon + Intel.
Highlights
Lyrics matching is structurally smarter. Apple Music labels the same recording with different titles across storefronts (mei ehara — "Invisible" on KR/HK/TW is the same audio as "不確か" on JP). nanoPod now resolves the cross-region alias once and fans the resolved CJK title out to all title-keyed sources (NetEase, QQ, LRCLIB, LRCLIB-Search, AMLL), not just the Chinese ones. LRCLIB indexed by the Japanese title becomes reachable, so tracks like Invisible / 不確か finally find their real synced lyrics.
Real timestamps, never fake. LyricsParser.detectKind is the single source of truth for whether a parsed lyric array carries real timing. NetEase and QQ plain-text fallbacks now tag .unsynced and skip the time offset, so the UI never auto-scrolls against fabricated timestamps.
No more same-artist collisions. The romanized→CJK escape now requires pure-ASCII input, preventing CJK input from picking a same-artist different-song match (e.g., 忘记有时 → 原来如此 by 王菀之).
Persistent metadata cache. ~/Library/Application Support/nanoPod/metadata_cache.json saves ~166 ms per warm song fetch (8.8% reduction across the verifier suite).
Verifier (43-song test set)
39/43 passed 0 warnings 4 no-lyrics
total 71 740 ms avg 1 668 ms
Remaining 4 no-lyrics: Karen Mok B-sides, obscure 70s J-pop, intermittent NetEase flake. All confirmed via direct API queries — none of the 7 sources index them.
Verified live (signed app, screenshot-confirmed)
| Track | Source | First line |
|---|---|---|
| mei ehara — Invisible | LRCLIB-Search | 幽霊 ほどけていたんだ @24.23 s |
| 王菀之 — 忘记有时 | 有时无心的散聚 @16.32 s | |
| Eman Lam — Xia Nie Piao Piao Chu Chu Wen | NetEase | 想 飞往东京 @28.67 s (syllable sync) |
Install
- Download
nanoPod-2.0-20260411-e7658aa.zip - Unzip and drag
nanoPod.appinto/Applications - First launch: right-click → Open (locally signed, not notarized — Gatekeeper will prompt once)
- Grant Music + Accessibility + Apple Events permissions when asked
SHA256: 08826a671c9959bdc06d0cd73304f1c77867f9c6968e0580365b7b1c461a024a
Requirements
- macOS 14 (Sonoma) or later — designed for macOS 26 Liquid Glass
- Music.app + an active Apple Music subscription (or local library)
- Apple Silicon or Intel Mac