SimpMusic 2.3.0 版本特性技术解析:Apple Music 播放器重构、歌词景深渲染与监听小票的实现细节
发布时间:2026/10/14 8:20:16 锦皓数字建站

音视频【免费下载链接】SimpMusicA cross-platform music app using YouTube Music for backend项目地址https://gitcode.com/gh_mirrors/si/SimpMusic点击查看免费下载本篇基于官方版本文档 changelogs/2.3.0/en-US.md 及其越南语版本 changelogs/2.3.0/vi-VN.md完整解读 SimpMusic 2.3.0 的全部 New / Improved / Fixed 条目并结合composeApp模块中的源码实现Apple Music 歌词景深模型、监听小票数据模型、日志导出脱敏正则、AI 品味卡片的数据窗口等把每条 changelog 落到可验证的文件路径与参数取值上帮助开发者快速了解该版本的实际改动范围与实现思路。一、版本总览2.3.0 改了什么2.3.0 是一次以播放器体验重构为主线的版本文档结构分为三块New11 项全新能力核心是 Apple Music 风格播放器的整体重构未裁剪封面、自形状动画封面、封面色背景、进度条上方的当前歌词行、比特率/采样率显示、输出按钮与 Cast 并列以及 Apple Music 式逐行上移歌词、Home 页重构、监听小票Listening receipt、AI 音乐品味卡片、音频输出切换、直播电台、艺术家页动画封面、App 日志查看器、播放队列内歌曲菜单、vivo 专属 APKImproved8 项改进覆盖 Classic / Material 3 Expressive 播放器、设置页分组、歌词时间偏移调节、Windows 标准标题栏、图片缓存、纯音频下载、UI 重绘优化与开发者博客源迁移Fixed15 项修复横跨 Windows、Desktop、Linux、Android 11 及多语言场景。以下按功能域展开并结合源码说明changelog 一句话背后的实现。二、Apple Music 式歌词景深模糊的量化模型changelog 中 Apple Music-style lyrics 一项描述当演唱的行发生变化时歌词行逐行上移而不是整块跳变。其渲染核心在 AppleMusicLyricsLines.kt该文件把 Apple Music 的视觉语言拆成了若干可量化的参数距离规则distance ruleappleMusicLyricFocus接收带符号的行距distanceFromCurrent已唱完的行额外 1唱过的页面比未到的页面退后更快当前行完全豁免模糊。见 AppleMusicLyricsLines.kt#L165-L200。模糊量的取值不是固定 dp而是相对字号的比例——每行距离贡献BLUR_PER_LINE_EM 0.095em上限BLUR_MAX_EM 0.45em即 32sp 字号下模糊半径约 3~14dp注释中说明这是对照参考截图实测one line out ~6px → 2.8ptfour out ~28px → 13pt换算而来的。见 AppleMusicLyricsLines.kt#L44-L51。透明度衰减当前行 α1每远离一行衰减0.25下限0.25没有活动行时前奏所有行统一0.6且不加模糊。平台差异处理Android 上模糊使用BlurredEdgeTreatment.Unbounded让柔化溢出文本边界形成浅景深观感Desktop 上由于 skiko 会按 item 边界裁剪LazyColumn子项改用BlurredEdgeTreatment.Rectangle避免被裁出硬边。见 AppleMusicLyricsLines.kt#L203-L233。排版常量主行 28spAppleMusicLyricFontSize、行距 34sp、行间距 20dp、副行译词/罗马音14sp/21sp全部以em语义随字号缩放非当前行使用灰色0xFF9B9B9B而非低透明度白色——注释明确说明低透明度白色在深色页面上仍是白色这是区分演唱行最强的信号。见 AppleMusicLyricsLines.kt#L78-L142。整块跳变 → 逐行上移的行为由LyricsView的滚动动画配合animateDpAsState/animateFloatAsState均为 400ms tween实现焦点随歌曲平滑下滑而非跳变。Improved 一节还提到歌词时间偏移timing offset现在可以直接在歌词界面调节而不仅是设置页Fixed 一节则修复了阿拉伯语等从右到左语言的逐词歌词word-by-word lyrics问题。三、Apple Music 播放器重构与音频输出changelog 的 Apple Music player, redesigned 列出了该播放器的一组具体元素未裁剪的整体封面the whole artwork without cropping、以封面自身形状呈现的动画封面、由封面色彩生成的背景、位于 seek 条上方的当前歌词行、流媒体的比特率与采样率显示以及在 Listen Together 旁边的 Cast 输出按钮。音频输出切换的入口在 AppleMusicOutputSheet.ktchangelog 强调 Only SimpMusics audio moves只移动本 App 的音频实现上该 Sheet 组合了com.maxrave.domain.data.player中的AudioOutput、AudioOutputKind与GenericCastState状态模型通过MediaPlayerHandler切换输出设备并用DeviceVolumeControllerexpect/actual 声明见 DeviceVolumeController.kt控制目标设备的音量Cast 接收方通过rememberCastReceivers枚举。播放器本体分别位于NowPlayingContentAppleMusic.kt、NowPlayingContentM3Expressive.kt、NowPlayingContentSpotify.kt等 播放器内容文件 中。Improved 一节的对应条目说明Classic 与 Material 3 Expressive 播放器也采用了同款动画封面播放方式且 M3 Expressive 的取色来自封面colour extraction——这与NowPlayingContentM3Expressive.kt的命名和位置相互印证。四、Home 重构与 Whats your music taste AI 卡片changelog 的 Home, redesigned 包含把 Your daily discover 做成大型轮播、支持 Play all 的分区显示播放全部按钮、Desktop 悬停出现播放按钮、以及 Library 中 Favorite / Followed / Most played / Downloaded 四类新卡片展示最新条目。Play all 文案在 strings.xml#L107 中定义string nameplay_allPlay all/stringHome 页的数据装配在 HomeViewModel.kt 与 ui/screen/home 目录下的 Home 相关界面中完成。Whats your music taste 卡片由 TasteViewModel.kt 驱动源码可以确认几个关键设计数据窗口固定为 12 个月WINDOW_DAYS 365与 changelog reads your last 12 months of listening 一致REQUIRED_ACTIVE_DAYS直接复用WrappedYear.REQUIRED_ACTIVE_DAYS即与 Wrapped 年度回顾共用同一最少活跃天数门槛见 TasteViewModel.kt#L325-L337输入规模有明确上限TOP_ARTISTS 25、TOP_SONGS 30、TOP_ALBUMS 10、PREVIOUS_ARTISTS 10、ARTIST_IMAGES 3、DAY_PARTS 4结果存储查询超时STORE_TIMEOUT_MS 2000ms送给 AI 的是结构化TasteInput包含language、topArtists、topSongs、topAlbums、dayParts按小时播放分布、replay/concentration听歌指纹特征、previousTopArtists上一年 Top 10用于品味变化判断等字段见buildInput()TasteViewModel.kt#L214-L245。注释明确写道AI 对听者一无所知它读到的一切都来自本地历史与 changelog using the AI provider you set up in Settings 的表述吻合状态机TasteUiState细分Hidden/Invite/NotEnoughData/Loading/Failed/Ready历史不足时显示还需多少活跃天数失败不会拖垮整页。UI 卡片在 ui/component/taste 组件目录中文案My music taste / 12 months on SimpMusic见 strings.xml#L946-L947。五、Listening receipt把 Top 歌曲打印成小票changelog 的 Listening receipt 条目从 Analytics 界面把一段时期内播放最多的歌曲分享为一张打印小票风格的图片。实现位于 ListeningReceipt.kt其数据模型值得展开internal data class ReceiptLine( val plays: Int, // QTY播放次数 val item: String, // 歌曲/条目名称 val durationSeconds: Int, // AMT单条时长 ) internal data class ListeningReceipt( val period: String, val orderNumber: Long, val name: String?, val printedOn: LocalDate, val lines: ListReceiptLine, val seed: Int, // 同十首歌永远生成同样的条码/校验码 ) { val itemCount: Int get() lines.sumOf { it.plays } // Receiptify 的算术每条 QTY × AMT总额为总和 val totalSeconds: Long get() lines.sumOf { it.plays.toLong() * it.durationSeconds.coerceAtLeast(0) } val authCode: String get() (seed.toUInt() % 1_000_000u).toString().padStart(6, 0) }摘自 ListeningReceipt.kt#L77-L100几个实现细节与 changelog 的对应关系打印当前 Analytics 界面显示的时段文件注释说明回退三周查看小票就是那三周的小票即ShareReceiptSheet(uiState, ...)直接消费AnalyticsUiState确定性设计seed同时驱动条码与 6 位authCodeseed % 1000000左补零同一组歌曲生成的票据标记一致分享落盘通过通用ShareImageSheet渲染为位图文件名前缀固定为SimpMusic_receipt小票的纸质底纹资源是 receipt_paper.jpg等宽字体来自 space_mono_regular.ttf。Analytics 侧的状态与查询在 AnalyticsViewModel.kt 与 AnalyticsScreen.kt 中维护。六、App log查看与导出且导出前强制脱敏changelog 的 App log 条目Settings → Developer option → App log 可查看应用日志并可导出用于附加到 bug 报告导出时移除 keys、cookies 与 IP 地址。入口由 AppLogScreen.kt 实现配套路由在 AppLogDestination.kt导出与脱敏逻辑在 AppLogFiles.kt#L196-L232脱敏采用模式匹配而非解析器注释原文a log line has no grammar to parseSECRETS列表包含 7 条正则分别覆盖正则目标处理方式Authorization/Cookie/Set-Cookie头值整体替换为[redacted]SAPISID、APISID、HSID、SSID、SID、SIDCC、LOGIN_INFO、sp_dc、sp_key、__Secure-*等 Google 系 cookie 名NAME[redacted]URL 查询参数key/token/access_token/refresh_token/api_key/sig/signature参数值替换为[redacted]Bearer后跟随的凭证替换为[redacted]AI provider 密钥sk-前缀16 位以上保留前缀替换为sk-[redacted]Netscape cookie 文件行制表符分隔末列值替换googlevideo URL 中携带的 IPip或/ip/路径段替换为[redacted]exportLog()将Logger.APP_LOG与Logger.ERROR_LOG两个日志文件按序拼接加上SimpMusic 版本号 · 平台头整体过一遍redactSecrets最终生成simpmusic-log-YYYYMMDD-HHMMSS.txt交给分享通道MIME 为text/plain。这与 changelog with keys, cookies and IP addresses removed 逐条对应。七、其余 New 条目与实现位置播放队列内歌曲选项队列行上的 ⋯ 打开完整歌曲菜单上移、下移、移到下一首、移除。实现位于通用底部弹层 ModalBottomSheet.kt#L1310-L1311moveItemToPlayNext(index)经musicServiceHandler下发play_next/move_to_play_next文案在 strings.xml 定义Live broadcastsYouTube Music 的直播电台可播放卡片带 LIVE 角标角标与相关 UI 位于 AdapterItems.kt 等列表组件中艺术家页动画封面艺术家页播放来自 Apple Music 的艺术家动画封面对应 issue 主题相关资产与渲染在 ui/screen 目录下的艺术家相关页面SimpMusic for vivo一个独立的 APK 工程让 vivo OriginOS 的原子岛Origin Island与音乐小组件可以识别它。从 settings.gradle.kts#L40 可以看到:vivoAndroidApp被纳入构建其 build.gradle.kts#L30 将applicationId设为com.spotify.music而主 androidApp/build.gradle.kts#L23 使用com.maxrave.simpmusic开发构建追加.dev后缀vivoAndroidApp 的 shortcuts.xml 注释也说明同一组快捷方式intent 指向本构建自己的包名。八、Improved 与 Fixed 条目速览Improved8 项均出自 changelogs/2.3.0/en-US.md 的 Improved 节Classic 与 M3 Expressive 播放器接入动画封面见第二节、第三节Settings 各分区按卡片分组——设置界面即 SettingScreen.kt歌词 timing offset 可在歌词界面直接调节Windows 桌面端改用标准 Windows 标题栏自带最小化/最大化/关闭按钮——从源码结构看窗口生命周期管理集中在 jvmMain 的 DesktopApp.kt窗口焦点监听等图片缓存策略调整封面保留一天且离线仍可见下载行为视频播放关闭时只下载音频流UI 平滑度底部栏、迷你播放器与玻璃拟态效果在画面无变化时减少重绘开发者博客及其通知改由 simpmusic.org 提供配套组件 BlogPromoDialog.kt。Fixed15 项按平台归类便于检索WindowsUnable to rename settings.preferences_pb.tmp崩溃DataStore 偏好文件重命名冲突涉及多个 issueDesktopWindows/Linux 通用打开 Settings 或播放列表菜单时崩溃、以及文件选择库引发的杀软误报——文件选择相关实现见 FilePicker.jvm.ktLinuxFedora 等非 Ubuntu 系发行版无声Android 11 及以下部分页面切换崩溃通用暂停状态下 seek 后进度条不跟随搜索历史滚动时关闭RTL 语言逐词歌词Shuffle 下拖动歌曲/加歌/Play next 会触发整队重新洗牌新版本通知播报旧版本、点击提示 This link is not supportedUS 榜单为空现同时展示周榜 Top podcast shows重装后日文罗马音丢失Login Sync 在 Android 17 上现在会申请局域网权限对应 expect 声明 LocalNetworkPermission.kt浅色主题下返回按钮保持白色、歌曲选项弹层封面被挤压Apple Music 播放器中竖屏视频压到标题跨页编辑同步的 YouTube 播放列表失败。九、版本文档的组织方式SimpMusic 的发布说明按版本号/语言两级目录管理当前仓库存在 changelogs/2.2.0/ 与 changelogs/2.3.0/各含en-US.md与vi-VN.md双语版本条目统一按New / Improved / Fixed三节组织每条特性标注对应上游 issue 编号以便追溯。此外 fastlane/metadata 下维护了 Google Play 各语言en-US、vi-VN的逐版本 changelog 文本1.txt~60.txt用于商店端发布。阅读该版本时的建议路径先通读 en-US 条目再按本文列出的源码文件定位对应实现。小结2.3.0 的主线可以概括为三句话Apple Music 播放器重构连同 Classic / M3 Expressive 的封面取色确立了新的播放体验基线Apple Music 式歌词用一套可量化的景深参数0.095em/行、上限 0.45em、α 每行 -0.25在 Compose 中复刻了参考实现而监听小票、AI 品味卡片、日志脱敏导出则分别展示了Analytics 数据 → 可分享位图本地历史 → 结构化 TasteInput → 用户自配 AI provider与日志 → 正则脱敏 → 分享三条数据管线。所有条目均可在 changelogs/2.3.0/en-US.md 与上文列出的composeApp、vivoAndroidApp源码路径间相互印证。赞分享音视频【免费下载链接】SimpMusicA cross-platform music app using YouTube Music for backend项目地址https://gitcode.com/gh_mirrors/si/SimpMusic点击查看免费下载相关推荐Apple Music Like LyricsAMLL入门导读Apple Music 风格逐词歌词渲染组件与开源生态Apple Music Like LyricsAMLL入门导读Apple Music 风格逐词歌词渲染组件与开源生态 本文以 packages/docs/前端UI组件上一篇CANN ops-math 算子开发指南aclnnIsClose 两段式接口详解与 NPU 源码级实现剖析下一篇Prettier Check Ignore Pragma 实战结合 Markdown Front Matter 使用 noformat / noprettier 让指定文件跳过格式化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。