Skip to content

Releases: yinanli1917-cloud/AM-MiniPlayer

nanoPod v2.5

03 May 06:33

Choose a tag to compare

What's New

Skip Next/Previous Micro-Interactions

  • Two play.fill SF 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

03 May 02:19

Choose a tag to compare

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

01 May 22:42

Choose a tag to compare

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

20 Apr 07:11

Choose a tag to compare

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

  1. Download nanoPod-2.1-20260420-9a4d072.zip
  2. Unzip and drag nanoPod.app into /Applications
  3. First launch: right-click → Open (locally signed, not notarized)
  4. 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

11 Apr 07:32

Choose a tag to compare

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
王菀之 — 忘记有时 QQ 有时无心的散聚 @16.32 s
Eman Lam — Xia Nie Piao Piao Chu Chu Wen NetEase 想 飞往东京 @28.67 s (syllable sync)

Install

  1. Download nanoPod-2.0-20260411-e7658aa.zip
  2. Unzip and drag nanoPod.app into /Applications
  3. First launch: right-click → Open (locally signed, not notarized — Gatekeeper will prompt once)
  4. 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