{{ i18n.app.name }}

{{ i18n.components.lyricView.phonetic }}
{{ i18n.components.lyricView.translation }}
{{ i18n.components.lyricView.timeAdjustment }}
{{lyricTiming.offsetLabel}}
{{ i18n.components.lyricView.recognizeSecondary }}
{{ i18n.pages.lrcConverter.translation }}{{ i18n.pages.lrcConverter.phonetic }}
{{ meta.title }}  -  {{ meta.artist }}
{{ i18n.app.name }}

{{ i18n.pages.start.title }}

{{ i18n.pages.start.subtitle }}

{{ i18n.pages.start.privacyHint }}

{{ i18n.actions.import }}

{{ i18n.pages.start.importTitle }}

{{ i18n.pages.start.optionsTitle }}
{{ i18n.pages.start.dropTitle }} {{ i18n.pages.start.dropDesc }}

{{ i18n.pages.lrcConverter.title }}

{{ i18n.pages.lrcConverter.description }}

{{ i18n.pages.lrcConverter.outputLabel }}
{{ lrcxResult }}

{{ i18n.pages.lrcConverter.optionsTitle }}

{{ i18n.pages.lrcConverter.optionsDescription }}

{{ i18n.pages.lrcConverter.mergeZeroDuration }}

{{ i18n.pages.lrcConverter.mergeZeroDurationHelp }}

{{ i18n.pages.lrcConverter.lineSequence }}

{{ i18n.pages.lrcConverter.sequenceHelp }}

{{ i18n.pages.lrcConverter.phonetic }}
{{ i18n.pages.lrcConverter.lyric }}
{{ i18n.pages.lrcConverter.translation }}

{{ i18n.pages.lrcConverter.currentOrder }}{{ sequenceOrder }}

{{ feedback }}

cover

{{ name }}

{{ i18n.pages.playlistPage.description }} {{ desc }}

{{tname}}
{{ i18n.actions.playAll }} {{countNum}}
{{ i18n.labels.cover }}
{{ i18n.labels.title }}
{{ i18n.labels.artist }}
{{ i18n.labels.duration }}
{{ i18n.labels.marks }}

{{ i18n.pages.fileMaintenance.kicker }}

{{ i18n.pages.fileMaintenance.title }}

{{ i18n.pages.fileMaintenance.subtitle }}
{{ i18n.pages.fileMaintenance.pendingRecords }} {{pendingRecordCount}}
{{ i18n.pages.fileMaintenance.pendingReferences }} {{pendingReferenceCount}}
{{ i18n.pages.fileMaintenance.observerBatches }} {{pendingObserverBatchCount}}
{{ i18n.pages.fileMaintenance.runtimeQueue }} {{runtimeQueueUpdated}}
{{statusText}}

{{ i18n.pages.fileMaintenance.completedTitle }}

{{completedRecordCount}}
{{record.title}} {{record.timeText}}
{{record.statusText}}

{{record.summaryText}}

{{record.rootText}} {{record.eventText}} {{record.thresholdText}} {{record.appliedText}}

{{ i18n.pages.fileMaintenance.operationResultTitle }}

{{item.label}} {{item.value}}

{{emptyTitle}}

{{emptyText}}

{{record.title}} {{record.timeText}}
{{record.statusText}}
{{record.rootText}} {{record.eventText}} {{record.thresholdText}} {{record.appliedText}}

{{record.summaryText}}

{{item.label}} {{item.value}}

{{ i18n.pages.fileMaintenance.operationResultTitle }}

{{item.label}} {{item.value}}
{{ i18n.pages.fileMaintenance.oldRoute }} {{item.oldRoute}}
{{affected.label}} {{affected.value}}
{{item.reasonText}}

{{ i18n.pages.fileMaintenance.noCandidates }}

使用指南

MiuPlayer Box

MiuPlayer Box 选择网页路线,不做二进制分发,尽量跟随浏览器新特性来实现本地音乐播放、歌词展示和数据管理。下面是关键能力、限制和常见配置说明。

安全授权 轻量可离线 本地优先 歌单可备份

为什么用网页做本地播放器

浏览器对文件访问、缓存、PWA、媒体控制和画中画的支持已经足够承担一部分桌面音乐播放器场景。相比传统桌面软件,网页播放器更轻、更容易更新,也更容易控制权限边界。

安全

文件和目录访问由浏览器授权,风险操作需要用户明确确认。

轻量

无需安装完整桌面程序,可离线使用,也方便保留或回退版本。

性能

面向万级曲库做渲染优化,避免为播放器额外启动一个完整浏览器壳。

数据掌控

尊重磁盘结构,不做多余缓存;歌单数据可导入、导出和备份。

受限功能说明

网页平台仍有边界。例如系统级快捷键、直接打开文件资源管理器等能力会受到浏览器限制。MiuPlayer Box 会尽量提供替代方案。

限制补救权衡
无法注册系统级快捷键播放器内快捷键与系统媒体控制不会抢占其他应用快捷键。
网页不能直接打开文件资源管理器安装 pwa-enhancer.exe 后使用自定义协议该能力需要用户主动安装并授权。
没有桌面歌词歌词小窗播放器可以部分替代浏览器目前不会支持透明顶层窗口这种危险API这个网页做不了≧ ﹏ ≦

完整功能建议环境

  • Chromium 内核浏览器,版本高于 130
  • Windows / Linux / macOS
  • 如需“在文件资源管理器中显示”,需安装 pwa-enhancer

想确认浏览器能力是否完整?

请打开 兼容性检测 页面查看结果。

本地音乐文件夹浏览

支持 .lrc 和 .lrcx 歌词文件,并会在需要时回退到内嵌歌词。

步骤

  1. 在开始页点击“打开文件夹”,选择音乐目录并授权读取。
  2. 进入“本地音乐浏览器”,即可看到对应目录。
  3. 如果需要显示真实系统路径,可在根目录右键文件夹并设置绝对路径。

画中画播放器

MiuPlayer Box 提供两类 Picture-in-Picture 播放器:迷你控制器和歌词播放器。

步骤

  1. 迷你播放器入口在底部播放控制区域:
  2. 歌词播放器入口在歌词视图中:
  3. 点击后没有反应时,请先检查浏览器兼容性。

在文件资源管理器中显示

该功能允许网页应用通过自定义协议打开系统文件资源管理器。

要求

  • Windows 10 或更高版本
  • 已安装 pwa-enhancer.exe
  • 为音乐根目录设置了绝对系统路径

安装 pwa-enhancer.exe

  1. 从下面链接或 GitHub 下载 pwa-enhancer,并放在固定目录。
  2. 在终端中运行 pwa-enhancer.exe --install。
  3. 回到 本地音乐浏览器 根路径,右键非临时文件夹并选择“设置绝对路径”。
  4. 将音乐文件夹对应绝对系统目录填充到输入框中。填写错误可能导致打开文件位置无效
pwa-enhancer.exe 会注册 explorerlink: 协议,使网页应用可以发起受控的资源管理器打开请求。卸载可运行 pwa-enhancer.exe --uninstall。

PWA 安装

你可以把 MiuPlayer Box 安装为独立窗口运行的 PWA。

要求

Chromium 内核浏览器,版本高于 110。

步骤

  1. 打开浏览器菜单,寻找“安装应用”或“安装 MiuPlayer Box”。
  2. 确认安装后,应用会以独立窗口打开。
  3. 安装后可从系统应用列表、任务栏或桌面快捷方式启动。
  4. 若有更新,下次打开应用时会自动刷新资源。

Guide

MiuPlayer Box

MiuPlayer Box takes the web app route instead of binary distribution. It follows modern browser features to provide local playback, lyric display, and data management. This page covers key features, limits, and common setup steps.

Permission-based Light and offline-ready Local-first Backup-friendly playlists

Why Use the Web for a Local Player

Browser support for file access, caches, PWA installation, media controls, and picture-in-picture is now strong enough for part of the desktop music player workflow. Compared with traditional desktop software, a web player stays lighter, easier to update, and clearer about permission boundaries.

Safety

File and folder access is controlled by the browser, and risky actions require explicit user confirmation.

Lightweight

No heavy desktop installation. Offline use and version staying are easier to manage.

Performance

The UI is optimized for large libraries and avoids launching another full browser shell just for playback.

Data Control

The app respects your folder structure, avoids unnecessary caches, and supports playlist import, export, and backup.

Known Platform Limits

The web platform still has boundaries. System-wide shortcuts and directly revealing files in Explorer are limited by the browser, so MiuPlayer Box provides practical workarounds where possible.

LimitWorkaroundNote
No system-wide shortcut registrationUse in-player shortcuts and system media controlsThe app will not hijack shortcuts from other apps.
A web page cannot directly open File ExplorerInstall pwa-enhancer.exe and use the custom protocolThis requires explicit installation and user-level authorization.
No desktop lyric overlayThe lyric popup player can partially replace itBrowsers are not going to support risky APIs like transparent always-on-top windows, so this web app cannot do that.

Recommended Environment

  • Chromium-based browser, version above 130
  • Windows / Linux / macOS
  • pwa-enhancer installed if you need reveal-in-file-explorer support

Want to verify browser support?

Open the Compatibility Check page and review the result.

Local Music Folder Explorer

Supports .lrc and .lrcx lyric files, with fallback to embedded lyrics when needed.

Steps

  1. On the start page, click Open Folder, choose a music folder, and grant read access.
  2. Go to Local Music Browser. The selected folder will appear there.
  3. To support real system paths, right-click a root folder and set its absolute path.

Picture-in-Picture Players

MiuPlayer Box provides two Picture-in-Picture players: a compact controller and a lyric player.

Steps

  1. The compact player button is in the bottom player controls:
  2. The lyric player button is in the lyric view:
  3. If nothing happens after clicking either button, check browser compatibility first.

Reveal in File Explorer

This feature lets the web app open a system file explorer through a custom protocol.

Requirements

  • Windows 10 or later
  • pwa-enhancer.exe installed
  • Absolute system path configured for the music root folder

Install pwa-enhancer.exe

  1. Download pwa-enhancer below or from GitHub, then place it in a fixed folder.
  2. Run pwa-enhancer.exe --install in a terminal.
  3. Go to the root path of Local Music Browser, right-click a non-temporary folder, and choose "Set absolute path".
  4. Fill in the absolute system directory for that music folder. If the path is wrong, reveal-in-file-explorer may not work correctly.
pwa-enhancer.exe registers the explorerlink: protocol, allowing controlled Explorer launches from the web app. Uninstall it any time with pwa-enhancer.exe --uninstall.

PWA Installation

You can install MiuPlayer Box as a standalone PWA window.

Requirements

Chromium-based browser, version above 110.

Steps

  1. Open the browser menu and look for Install App or Install MiuPlayer Box.
  2. Confirm the prompt, and the app will open in its own standalone window.
  3. After installation, you can launch it from the system app list, taskbar, or desktop shortcut.
  4. If updates are available, the PWA will refresh resources automatically the next time you open it.

{{ i18n.pages.compatibility.eyebrow }}

{{ i18n.pages.compatibility.title }}

{{ i18n.pages.compatibility.intro }}

{{ i18n.pages.compatibility.available }} {{ i18n.pages.compatibility.limited }} {{ i18n.pages.compatibility.unavailable }}

{{group.title}}

{{group.description}}

{{item.name}}

{{item.description}}

{{item.detail}}
{{item.statusText}}

关于项目

MiuPlayer Box

一个主打轻量、灵活和本地优先的网页音乐播放器。它尽量把浏览器的新能力用到音乐管理、歌词播放和歌单整理上,同时保留网页应用的低负担体验。 Web Platform New API 实验性项目, light but not slight!

v{{ version }} {{ builtTime }} Web Music Player

开发进度

当前应用界面和主要能力仍在持续完善。MiuPlayer Box 已经可以承担日常本地音乐播放,但歌单、设置、历史记录和高级歌词体验还有待持续演进。

  • 已完成基于文件夹的本地音乐浏览优化
  • 已完成现代歌词LRCX支持
  • 进行中灵活歌单
  • 进行中应用设置
  • 待优化听歌历史
  • 待优化WebDav体验
  • 待做深度优化界面,统一UX组件
  • 初步听歌统计
  • 初步国际化支持

又一音乐播放器?

通常每周我都会花大量时间听歌。在项目启动之初,我对当时的桌面音乐播放器感到沮丧,因为它们要么操作笨拙、设计过时,要么功能不符合个人习惯。 我对本地音乐做了大致文件夹分类,希望至少有直观的类文件浏览器式的音乐导航并且支持播放列表。 同时,我需要歌词渲染。

当时(2024年末)桌面端也有现成方案,但要么界面复古,要么基于Electron,安装包重、占用偏高、灵活度一般。歌词显示模式没有我设想的,并且在播放细节控制上我不大满意。 比较挑剔,那就自己造!? 基于一些Web平台新的实验性API,MiuPlayer Box从自用需求起步,再一次次尝试中逼近网页App的边界,并逐步把设想变为现实。

目标

  • 轻量:极致轻量,应用体积未压缩情况下不到2MB。
  • 平滑升级:无需厚重安装,更新和回退都自然。
  • 多音乐来源:支持本地、和远程音乐。以文件夹为核心组织音乐,并提供歌词支持。
  • 流畅:尽量减少 UI 渲染和媒体解析的负担
  • 开放:允许本地、WebDAV 和更多来源并存。逐步开放自定义API
  • 歌单:提供更自由、可备份、可迁移的歌单体验。
  • 无侵入:细节高度可控,选择权交给用户
  • 安全:所有权限受浏览器沙箱保护,随时可便捷地撤销。
  • 绿色:纯粹无广无后台网络请求,统计可关。个人自用,直到倒闭初心不变

个人私心

MiuPlayer Box是一款按个人喜好随心所欲的音乐播放器,也是拒绝循规蹈矩的 Web Experiment Project。

作者只想做极致,目标是最强网页本地音乐播放器;(据说代码非常优雅ヾ(≧▽≦*)o)
同时也是 LRCX 高级歌词播放器示例项目。(作者也绝对不会告诉你大费周章设计歌词格式写播放器只是为了方便学喜欢的歌的!! ̄へ ̄)

致谢

SoberJS

WebComponent响应式前端组件库,其极致轻量低侵入的设计理念与MiuPlayer Box高度一致

WebDAV

面向 NodeJS 与 Web 的 WebDAV 客户端,代码质量不错

About

MiuPlayer Box

A lightweight, flexible, local-first web music player. It brings modern browser capabilities into music browsing, lyric playback, and playlist management while keeping the app easy to open and update. It is also an experimental project exploring new Web Platform APIs: light, but not slight!

v{{ version }} {{ builtTime }} Web Music Player

Development Status

The interface and major features are still evolving. MiuPlayer Box is already useful for daily local playback, while playlist editing, settings, listening history, and advanced lyric tools will keep improving.

  • DoneFolder-based local music browser polish
  • DoneModern LRCX lyric support
  • In progressFlexible playlists
  • In progressApplication settings
  • Needs improvementListening history
  • Needs improvementWebDAV experience
  • PlannedDeep UI polish and a unified UX component system
  • Early stageListening statistics
  • Early stageInternationalization support

Why Another Music Player?

I usually spend a lot of time listening to music each week. When this project started, I was frustrated with the desktop music players available at the time: they were awkward to use, visually dated, or simply did not fit my habits. I had already organized my local music roughly by folders, so I wanted at least an intuitive file-browser-style way to navigate music, with proper playlist support. I also needed lyric rendering.

In late 2024, desktop options were available, but some had dated interfaces while others were built on Electron, with larger installers, higher resource use, and average flexibility. Their lyric display modes did not match what I had in mind, and I was not satisfied with the playback controls. I was picky, so why not build my own!? Using experimental Web Platform APIs, MiuPlayer Box started as a tool for my own needs. Through repeated experiments, it has gradually pushed the boundaries of what a web app can do and turned those ideas into reality.

Goals

  • Lightweight: keep the app extremely small, under 2MB even before compression.
  • Smooth upgrades: no heavy installer, and updates or rollbacks should feel natural.
  • Multiple music sources: support local and remote music, organize it around folders, and provide lyric support.
  • Fluid: reduce the cost of UI rendering and media parsing wherever possible.
  • Open: let local music, WebDAV, and more sources coexist, and gradually open custom APIs.
  • Playlists: offer a freer playlist experience that is easy to back up and migrate.
  • Non-intrusive: make the details highly controllable and leave the choice to the user.
  • Safe: permissions stay inside the browser sandbox and can be revoked easily at any time.
  • Clean: no ads or background network requests; statistics can be disabled. Built for personal use, with that purpose unchanged for as long as the project lasts.

A Personal Motive

MiuPlayer Box is a music player built around personal taste and freedom, and a Web Experiment Project that refuses to follow convention.

The author just wants to push things to the limit, aiming to build the best local music player on the web; (or so they say—the code is supposedly very elegantヾ(≧▽≦*)o)
It is also an example project for advanced LRCX lyric playback. (The author would never tell you that all the work on designing a lyric format and building a player was just to make it easier to learn favorite songs!! ̄へ ̄)

Thanks

SoberJS

A responsive WebComponent front-end library whose extremely lightweight, low-intrusion design philosophy aligns closely with MiuPlayer Box.

WebDAV

A WebDAV client for NodeJS and the web, with solid code quality.

使用帮助

常见问题

MiuPlayer Box 把本地文件、浏览器权限与 PWA 能力组合在一起,因此部分行为与传统桌面播放器不同。 这里按实际任务解释最常遇到的问题。

导入、权限与数据

从选择音乐到长期保存曲库,遵循浏览器为本地文件设置的边界。

选择“文件”和“文件夹”有什么区别?

选择文件适合快速加入一首或少量音乐;选择文件夹会建立一个曲库入口并扫描其中的音频。是否继续扫描子文件夹由导入区的“包含子文件夹”选项决定。不同浏览器提供的文件夹能力不同,支持 File System Access API的浏览器以文件夹打开方可解锁完整体验。功能受限时仍可退回临时播放。

为什么选过文件夹后,还可能需要重新授权?

文件访问权限由浏览器保存和恢复,而不是由播放器绕过系统长期持有。重启浏览器、使用隐私模式、清理站点数据、浏览器策略变化,或移动和重命名文件夹,都可能让原授权失效。重新选择同一目录只是恢复访问关系,不会复制或上传目录内容。

导入的本地音乐会上传到服务器吗?

不会因为“选择文件”或“选择文件夹”而自动上传。本地音频由浏览器直接读取并播放。在线媒体、在线歌词或其他网络来源可能各自发起网络请求,但这与本地导入是不同的数据路径。

文件能看到,为什么仍然无法播放?

扩展名只说明文件声称的格式,真正能否播放还取决于音频编码、文件是否损坏,以及当前浏览器和系统提供的解码器。同一种容器也可能装入不同编码。可以先查看兼容性检测的格式声明,再用其他已知正常的音频交叉验证。

为什么清理站点数据后,歌单或授权记录消失了?

歌单、设置、文件句柄与离线资源都可能保存在浏览器的站点存储中。清理站点数据、重装浏览器配置或使用临时会话,可能一并删除这些资料。重要歌单与配置应定期从设置页的本地数据区域导出备份;备份不包含音乐文件。

本地音乐、歌单、设置等备份如何恢复

歌单、设置备份导入受支持版本后数据生效。本地音乐文件句柄无法被导出,导入备份到新应用程序需要重新授权与备份目录名称一致的音乐文件夹,期间不宜修改文件夹内音乐名称和路径,歌单根据音乐相对路径确定以有效迁移,歌单中本地灰色音乐文件灰色可请检查对应根目录是否正确添加。

设备、权限与安装

系统设备与离线能力会同时受到浏览器、操作系统和当前安全上下文影响。

选择输出设备为什么可能请求麦克风权限?

支持输出设备专用选择 API 的浏览器会在点击刷新按钮时直接请求输出设备授权,不申请麦克风。其他浏览器会先尝试无权限枚举;只有输出设备名称仍被隐藏时,才会一次性请求临时麦克风权限来解锁设备列表。MiuPlayer Box 取得结果后会立即停止临时音频轨道,不使用麦克风。若浏览器拒绝输出设备授权,设备切换仍可能受限。

安装为 PWA 后,就一定能完全离线使用吗?

不一定。安装只表示应用可以像独立窗口一样启动;离线可用依赖 Service Worker 是否控制当前页面、所需资源是否已经缓存,以及缓存是否被系统回收。首次使用或版本切换后,可关闭应用重新后再次打开确认离线资源状态。

歌词与播放队列

播放相关工具将保持连续工作,同时允许用户随时覆盖自动行为。(AI大人你写了啥,这是在说什么???🥴)

歌词为什么缺失、错位或匹配到别的歌曲?

歌词来源可能依赖文件内嵌信息、同名歌词或在线匹配;不完整的标题、艺人和时长会降低匹配准确度。先检查音乐元数据和歌词来源,再手动替换或校正歌词。逐词时间轴本身有误时,需要在歌词工具中重新调整。噢!内置歌词忘记做兜底显示了,下次记得再加吧。。。

LRC → LRCX 转换很麻烦?

页面转换器只做基本格式转换处理,适用于快速转换。需要手动保存同名`.lrcx`。
好消息!!🎉在线转换服务现已可用:LRC to LRCX服务。支持自动批量转换、增加日语注音上标,可自动写入歌词文件。

播放队列为什么会自动展开、收缩,按钮又为什么消失?

播放列表突然就不见了?如果不喜欢可以在 设置-播放控制 中关闭播放队列“自动展开/收缩”设置项。不过播放队列按钮处于视觉出让仍会自动消失,该设计会后续会考虑优化。 记忆按钮位置很奇怪,你是对的,但播放队列面板自动收缩是本播放一项特色细节,鼠标靠近右侧响应区域自动浮出,随鼠标停留、隐藏,也许你可以试试;

如何排查兼容性

检测通过也不保证可用😇

兼容性检测中的“可用”“受限”与“不可用”分别代表什么?

“可用”:当前环境暴露了预期能力或已确认相应状态;“受限”:存在回退方案、尚未获得持久状态,或只能确认 API 入口;“不可用”:当前检测没有发现所需入口。检测不会主动申请权限,也不能保证每个文件、设备和系统策略都成功,请结合实际操作判断。

Help

Questions & answers

MiuPlayer Box combines local files, browser permissions, and PWA capabilities, so some behavior differs from a traditional desktop player. These answers are organized around the tasks people most often need to complete.

Imports, permissions, and data

From choosing music to keeping a library, it helps to understand the boundaries browsers place around local files.

What is the difference between choosing files and choosing a folder?

Choosing files is useful for quickly adding one track or a small selection. Choosing a folder creates a library entry and scans it for audio. The “include subfolders” option decides whether that scan continues into nested folders. Folder support varies by browser; browsers with the File System Access API provide the full folder-based experience, while limited environments can fall back to temporary playback.

Why might I need to grant access to a folder again?

The browser stores and restores file permissions; the player cannot bypass the system and keep permanent access by itself. Restarting the browser, using a private session, clearing site data, changing browser policy, or moving or renaming the folder can invalidate a previous grant. Selecting the same folder again only restores that relationship—it does not copy or upload its contents.

Are imported local tracks uploaded to a server?

No upload happens automatically when you choose files or a folder. The browser reads and plays local audio directly. Online media, online lyrics, or other network providers may make their own requests, but those use a different data path from local import.

Why is a visible file still unplayable?

A filename extension only says what the file claims to contain. Playback also depends on the audio codec, file integrity, and the decoders supplied by the browser and operating system. The same container can hold different codecs. Check the format declarations on the compatibility page, then compare with another file that is known to work.

Why did playlists or permission records disappear after site data was cleared?

Playlists, settings, file handles, and offline resources may all live in browser site storage. Clearing that storage, rebuilding a browser profile, or using a temporary session can remove them together. Export important playlists and configuration regularly from the Local Data area in Settings. A backup does not include the original music files.

How do I restore a playlist and settings backup and reconnect local music?

After importing a playlist and settings backup into a supported version, the data becomes available. Local music file handles are not included in exports. When restoring in a new installation, grant access again to the music folder whose name matches the one in the backup. Avoid renaming or moving files inside that folder during migration: playlists locate local tracks by their relative paths. If a local track appears grayed out in a playlist, check that its root folder has been added correctly.

Devices, permissions, and installation

System devices and offline behavior depend on the browser, operating system, and current security context.

Why can choosing an output device request microphone permission?

Browsers that provide a dedicated output-device picker use it when you click the refresh button, so microphone permission is not needed. Other browsers are queried without permission first; microphone access is only requested as a legacy fallback when output-device names remain hidden. MiuPlayer Box immediately stops the temporary audio tracks afterward and does not record. If output permission is denied, device names or switching may remain limited.

Does installing the PWA guarantee full offline use?

No. Installation means the app can launch in its own window. Offline use also depends on whether a Service Worker controls the page, whether required resources have already been cached, and whether the system has reclaimed that cache. After first use or a version change, close and reopen the app to confirm its offline-resource state.

Lyrics and the playback queue

Playback tools can automate some behavior, but you can override it at any time.

Why are lyrics missing, out of sync, or matched to another song?

Lyrics may come from embedded metadata, a matching local lyric, or an online match. Incomplete title, artist, and duration data reduces matching accuracy. Check the track metadata and lyric source first, then replace or correct the lyric manually. If word-level timing is wrong, adjust it with the lyric tools. The built-in lyric fallback is not in place yet, but is planned for a future update.

Is LRC → LRCX conversion a hassle?

The page converter handles basic format conversion for quick use. Save the result manually as a .lrcx file with the same name.
Good news! 🎉 The online converter is now available: LRC to LRCX Service. It supports automatic batch conversion, adding Japanese ruby annotations, and writing the converted lyric file automatically.

Why does the queue expand or collapse automatically, and why does its button disappear?

Did the playback queue suddenly disappear? If you prefer, go to Settings → Playback controls and turn off “Automatically expand and collapse the playback queue.” The queue button can still auto-hide even when this setting is off; this behavior may be improved later. The button's placement is admittedly odd, but automatic queue collapse is one of this player's signature details: move the pointer near the activation area on the right to reveal the panel; it hides again as the pointer moves away. Give it a try.

Troubleshooting compatibility

Passing the check does not guarantee that everything will work 😇

What do “available,” “limited,” and “unavailable” mean?

“Available” means the expected capability is exposed or its relevant state was confirmed. “Limited” means a fallback exists, persistence has not been granted, or only the API entry point can be confirmed. “Unavailable” means the current check did not find the required entry point. The check never requests permission and cannot guarantee that every file, device, or system policy will work; confirm the result with the actual task.

{{ i18n.pages.localMusic.title }}

{{ i18n.actions.playAll }}
{{ i18n.pages.localMusic.searchMusic }}

{{ i18n.pages.playlists.title }}

{{ target }}
{{ i18n.pages.playlists.searchMusic }}
playlist-cover

{{pItem.name}}

{{pItem.desc}}

{{ i18n.pages.onlineLibrary.title }}

{{ i18n.pages.onlineLibrary.newTab }}

{{ i18n.pages.onlineLibrary.chooseType }}

WebDAVNeteaseNavidrome

://
://
{{ i18n.actions.playAll }}{{ i18n.pages.onlineLibrary.showCover }}
{{ i18n.labels.cover }}
{{ i18n.labels.title }}
{{ i18n.labels.artist }}
{{ i18n.labels.marks }}
{{ i18n.actions.playAll }} {{ i18n.actions.refresh }}
{{ i18n.pages.localMusic.loadMeta }}
{{ i18n.actions.playAll }}{{ i18n.pages.onlineLibrary.showCover }}
{{ i18n.labels.cover }}
{{ i18n.labels.title }}
{{ i18n.labels.artist }}
{{ i18n.labels.marks }}

{{ i18n.pages.playHistory.title }}

{{historyCount}}
{{ i18n.status.loading }}
{{ i18n.pages.playHistory.emptyTitle }} {{ i18n.pages.playHistory.emptyText }}
{{ i18n.pages.playHistory.filteredEmpty }}

{{ i18n.pages.playStats.title }}

{{ i18n.pages.playStats.localOnly }}
{{ i18n.pages.playStats.rangeLabel }}{{range.label}}
{{ i18n.pages.playStats.libraryOverview }} {{libraryNote}} {{indexUpdatedText}}
{{metric.label}} {{metric.value}}
{{indexProgressText}}

{{emptyTitle}}

{{emptyText}}

{{ i18n.pages.playStats.hourlyTitle }}

{{hourReadout}}
{{tick.label}}

{{ i18n.pages.playStats.weeklyTitle }}

{{rangeLabel}}
{{item.label}} {{item.display}}

{{ i18n.pages.playStats.libraryTitle }}

{{libraryNote}}

{{ i18n.pages.playStats.libraryAudio }}

{{segment.name}} {{segment.value}} · {{segment.percentText}}

{{ i18n.pages.playStats.libraryLyric }}

{{segment.name}} {{segment.value}} · {{segment.percentText}}

{{ i18n.pages.playStats.genreTitle }}

{{ i18n.pages.playStats.genreDesc }}
{{genre.name}}

{{ i18n.pages.playStats.rankingTitle }}

{{ i18n.pages.playStats.topListened }}{{ i18n.pages.playStats.topPlayed }}
{{index + 1}}
{{song.title}} {{song.artist || i18n.status.unknown}}
{{formatRankingValue(song)}}
{{ i18n.pages.playStats.specialDaysTitle }} {{ i18n.pages.playStats.specialDaysSubtitle }}
{{item.title}} {{item.day}}

{{item.reason}}

{{item.value}}
{{fragment.prefix}} {{fragment.value}} {{fragment.suffix}}

{{ i18n.pages.settings.title }}

{{ i18n.pages.settings.basic }}

{{ i18n.pages.settings.language }} {{ i18n.pages.settings.languageTrigger }}
{{ i18n.pages.settings.persistentStorage }} {{ i18n.pages.settings.persistentDesc }}

{{ i18n.pages.settings.ui }}

{{themeBackgroundDetailSummary}} {{themeBrightnessSummary}}
{{ i18n.pages.settings.themeColor }} {{ i18n.pages.settings.themeColorDesc }}
{{themeCoverColor}} {{themeCoverStatus}}
{{themeColor}}
{{ i18n.pages.settings.themePaletteLight }}
{{ i18n.pages.settings.themePaletteDark }}
{{ i18n.pages.settings.themeBrightness }} {{themeBrightnessSummary}}
{{ i18n.pages.settings.themeBackground }} {{themeBackgroundDetailSummary}}
{{themeSolidCustomColor}}
{{ i18n.pages.settings.themeSourceUpload }} {{ i18n.pages.settings.themeImageDesc }}

{{ i18n.pages.settings.playback }}

{{ i18n.pages.settings.audioDevice }} {{audioDeviceStatus}}
{{labels.rate}}{{labels.rateDesc}}
{{labels.semitones}}{{labels.pitchDesc}}
{{labels.target}}{{loudnessStatus}}
{{labels.advanced}}
{{compressorLevels}}

{{ i18n.pages.settings.features }}

{{ i18n.pages.settings.localFileSection }}

{{ i18n.pages.settings.shortcuts }}

{{ i18n.pages.settings.shortcutsDesc }}
{{shortcut.title}}
{{shortcut.bindingText}}
{{shortcut.statusText}}

{{ i18n.pages.settings.advanced }}

{{ i18n.pages.settings.cacheSize }}

{{ i18n.pages.settings.cacheSizeDesc }}
{{ i18n.pages.settings.cacheUsage }} {{LRU_usage}}/{{LRU_SIZE}}
{{ i18n.pages.settings.cacheCountUnit }}
{{LRU_SIZE}}

{{ i18n.pages.settings.serviceWorker }}

{{swStatusText}}
{{ i18n.pages.settings.registration }} {{swRegistrationText}} {{ i18n.pages.settings.controller }}: {{swControllerText}}
{{ i18n.pages.settings.active }} {{swActiveVersionText}} {{ i18n.pages.settings.stayed }}: {{swPinnedVersionText}}
{{ i18n.pages.settings.update }} {{swUpdateText}} {{ i18n.pages.settings.integrity }}: {{swIntegrityText}}
{{ i18n.pages.settings.clients }} {{swClientText}} {{ i18n.pages.settings.conflicts }}: {{swConflictText}}
{{ i18n.pages.settings.support }}{{swSupportedText}} {{ i18n.pages.settings.savedStay }}{{swStoredStayText}} {{ i18n.pages.settings.versions }}{{swVersionCount}} {{ i18n.pages.settings.caches }}{{swCacheCount}}
{{swOperationText}}
{{ i18n.pages.settings.versionTarget }} {{ i18n.pages.settings.integrity }}: {{swIntegrityText}}
{{swVersionActionHintText}}

{{ i18n.pages.settings.localData }}

{{ i18n.pages.settings.storageUsage }} {{ dataMB }} MB

{{ i18n.pages.settings.exportPlaylist }}

{{ i18n.pages.settings.exportPlaylistDesc }}

{{ i18n.pages.settings.clearOfflineCache }}

{{ i18n.pages.settings.clearOfflineCacheDesc }}

{{ i18n.pages.settings.deleteDatabase }}

{{ i18n.pages.settings.deleteDatabaseDesc }}

{{appVersion}} {{ i18n.pages.settings.updateLastCheck }}: {{updateLastCheckText}} {{updateStatusText}}