### 下载地址
[飞书云文档](https://r0rvr854dd1.feishu.cn/drive/folder/IrVEfD67KlWZGkdqwjecLHFNnBb?from=from_copylink)
## 特性
- 插件化:本软件仅仅是一个播放器,本身**并不集成**任何平台的任何音源,所有的搜索、播放、歌单导入等功能全部基于**插件**。这也就意味着,**只要可以在互联网上搜索到的音源,只要有对应的插件,你都可以使用本软件进行搜索、播放等功能。** 关于插件的详细说明请参考 [安卓版 Readme 的插件部分](https://github.com/maotoumao/MusicFree#%E6%8F%92%E4%BB%B6)。
- 插件支持的功能:搜索(音乐、专辑、作者、歌单)、播放、查看专辑、查看作者详细信息、导入单曲、导入歌单、获取歌词等。
- 定制化:本软件可以通过主题包定义软件外观及背景,详见下方主题包一节。
- 无广告:基于 AGPL3.0 协议开源,将会保持免费。
- 隐私:软件所有数据存储在本地,本软件不会上传你的个人信息。
## 插件
插件协议和安卓版完全相同。
[示例插件仓库](https://github.com/maotoumao/MusicFreePlugins),你可以根据[插件开发文档](https://musicfree.catcat.work/plugin/introduction.html) 开发适配于任意音源的插件。
## 主题包
主题包是一个文件夹,文件夹内必须包含两个文件:
```bash
index.css
config.json
```
### index.css
index.css 中可以覆盖界面中的任何样式。你可以通过定义 css 变量来完成大部分颜色的替换,也可以查看源代码,根据类名等覆盖样式。
支持的 css 变量如下:
``` css
:root {
--primaryColor: #f17d34; // 主色调
--backgroundColor: #fdfdfd; // 背景色
--dividerColor: rgba(0, 0, 0, 0.1); // 分割线颜色
--listHoverColor: rgba(0, 0, 0, 0.05); // 列表悬浮颜色
--listActiveColor: rgba(0, 0, 0, 0.1); // 列表选中颜色
--textColor: #333333; // 主文本颜色
--maskColor: rgba(51, 51, 51, 0.2); // 遮罩层颜色
--shadowColor: rgba(0, 0, 0, 0.2); // 对话框等阴影颜色
/** --shadow: // shadow属性 */
--placeholderColor: #f4f4f4; // 输入区背景颜色
--successColor: #08A34C; // 成功颜色
--dangerColor: #FC5F5F; // 危险颜色
--infoColor: #0A95C8; // 通知颜色
--headerTextColor: white; // 顶部文本颜色
}
```
具体的例子可以参考 [暗黑模式](https://github.com/maotoumao/MusicFreeThemePacks/blob/master/darkmode/index.css)
除了通过 css 定义常规样式外,也可以通过在 config.json 中定义 iframes 字段,用来把任意的 html 文件作为软件背景,这样可以实现一些单纯用 css 无法实现的效果。
### config.json
config.json 是一个配置文件。
```json
{
"name": "主题包的名称",
"preview": "#000000", // 预览图,支持颜色或图片;
"description": "描述文本",
"iframes": {
"app": "http://musicfree.catcat.work", // 整个软件的背景
"header": "", // 头部区域的背景
"body": "", // 侧边栏+主页面区域的背景
"side-bar": "", // 侧边栏区域的背景
"page": "", // 主页面区域的背景
"music-bar": "", // 底部音乐栏的背景
}
}
```
如果需要指向本地的图片,可以通过 ```@/``` 表示主题包的路径;preview、iframes、以及 iframes 指向的 html 文件都会把 ```@/``` 替换为 ```主题包路径```。详情可参考 [樱花主题](https://github.com/maotoumao/MusicFreeThemePacks/tree/master/sakura)
### 主题包示例
示例仓库:https://github.com/maotoumao/MusicFreeThemePacks
几个主题包效果截图:
#### 暗黑模式
[源代码](https://github.com/maotoumao/MusicFreeThemePacks/tree/master/darkmode)

#### 背景图片
[源代码](https://github.com/maotoumao/MusicFreeThemePacks/tree/master/night-star)

#### fliqlo
[源代码](https://github.com/maotoumao/MusicFreeThemePacks/tree/master/fliqlo)

#### 樱花
[源代码](https://github.com/maotoumao/MusicFreeThemePacks/tree/master/sakura)

#### 雨季
[源代码](https://github.com/maotoumao/MusicFreeThemePacks/tree/master/rainy-season)

## 启动项目
下载仓库代码之后,在根目录下执行:
```bash
npm install
npm start
```
## 支持这个项目
如果你喜欢这个项目,或者希望我可以持续维护下去,你可以通过以下任何一种方式支持我;)
1. Star 这个项目,分享给你身边的人;
2. 关注公众号【一只猫头猫】获取最新信息;
## 截图



================================================
FILE: changelog.md
================================================
`2025-10-24 v0.0.8`
1. 【修复】修复了一些可能导致白屏的问题
`2025-03-30 v0.0.7`
1. 【功能】开发者模式:狂点托盘图标可打开开发者工具
2. 【修复】修复退出应用时可能出现的进程残留的问题(感谢@dyfllll)
3. 【修复】修复windows控制中心无法控制暂停/播放状态的问题
4. 【修复】修复打开歌词窗口/迷你模式窗口歌词可能始终为空的问题
5. 【修复】修复配置出错时软件白屏的问题
6. 【修复】修复任务栏上的关闭按钮表现和设置中的选项不一致的问题
`2024-12-25 v0.0.6`
1. 【优化】大量代码重构
2. 【功能】新增播放失败时不寻找其他音质版本的配置
3. 【功能】歌单内支持通过 ctrl 键盘多选歌曲批量操作
4. 【功能】支持自定义主窗口大小
5. 【功能】支持自定义歌词窗口大小
6. 【功能】调整播放详情页面的样式
7. 【功能】支持了评论功能(需要插件支持)
8. 【修复】修复了歌单id无法带特殊字符的问题
9. 【修复】修复了音源太多时布局异常的问题
`2024-06.25 v0.0.5`
【修复】修复重启软件后歌单丢失的问题;如果未出现上述问题可忽略此版本更新
`2024-06.16 v0.0.4`
1. 【功能】播放列表支持拖拽排序
2. 【功能】支持多语言。本次支持简体中文、繁体中文、英文、西班牙语
3. 【功能】支持歌词翻译功能(需要插件实现 getLyric 方法)
4. 【功能】新增最近播放,默认保存最近播放的 500 首歌
5. 【功能】新增小窗模式
6. 【功能】新增音频设备移除时的行为设置,现在可以让拔掉耳机的时候停止播放了
7. 【功能】新增单独的主题页,可以在主题市场中直接使用主题;本地.mftheme 主题可以直接拖拽到播放器安装
8. 【优化】本地音乐会尝试读取本地路径下的同名 .lrc 文件作为歌词;同时会读取同名 -tr.lrc 文件作为翻译
9. 【修复】修复部分情况下本地歌词无法读取的问题
10. 【修复】修复 linux 托盘点击无效的问题
`2023-12.23 v0.0.3`
1. 【功能】插件支持拖拽排序,该排序会影响到搜索结果、排行榜、热门歌单的展示顺序
2. 【功能】播放列表支持多选快捷键(Ctrl + A 全选、按住 Shift 批量选择)
3. 【功能】本地音乐新增搜索功能
4. 【功能】歌单内歌曲支持拖拽排序
5. 【功能】新增了一些插件设置,比如启动软件时自动更新插件
6. 【功能】新增缓存设置,可以在设置中清空软件缓存
7. 【功能】新增网络代理设置
8. 【功能】插件协议更新:新增支持「用户变量」。
9. 【功能】插件协议更新:榜单列表支持分页
10. 【功能】歌单支持 WebDAV 备份;插件预置的 npm 包新增 webdav,配合 WebDAV 插件即可播放 WebDAV 源
11. 【优化】排序/过滤后,点击歌单列表会播放排序/过滤后的歌曲,而非全部歌曲
12. 【优化】优化批量删除歌曲失败时的表现
13. 【优化】优化歌单内歌曲较多时的体验
14. 【优化】优化歌曲名称超长时右下角菜单的显示
15. 【优化】加载本地歌曲时会自动识别歌曲元信息的编码,减少出现乱码的可能性
16. 【优化】优化本地歌曲过多时的拖拽表现
17. 【优化】优化 windows7/8 部分按钮的表现
18. 【修复】修复 macos、linux 本地歌曲无法播放的问题
19. 【修复】修复部分情况下无法右键打开下载文件夹的问题
20. 【修复】修复 macos 输入框无法粘贴的问题
21. 【修复】修复部分情况下快捷键无法删除的问题
22. 【修复】重写了本地歌单逻辑,修复收藏歌单部分情况下无法点击的问题
`2023-11.5 v0.0.2`
1. 【功能】支持播放 .m3u8 源
2. 【功能】打开播放列表时锚定到当前正在播放的歌曲
3. 【功能】新增搜索歌词功能,你可以在歌曲详情页右键点击,并单击【搜索歌词】功能唤起搜索弹窗
4. 【功能】重写了本地歌曲的导入机制,新增本地音乐视图(列表、作者、专辑、文件夹)
5. 【功能】新增支持隐藏歌曲列表的部分列
6. 【功能】新增快捷键:喜欢/不喜欢歌曲
7. 【功能】已经下载的歌曲/本地歌曲支持右键打开
8. 【功能, windows】新增缩略图配置,你可以选择在任务栏悬浮图标时展示原窗口或专辑封面
9. 【功能, windows】新增任务栏播放控制按钮
10. 【优化】优化主题包安装机制:取消原本安装文件夹的机制,修改为安装 .mftheme 或 .zip 的文件,支持批量安装
11. 【优化】优化了从热门歌单页详情页返回时的表现
12. 【优化】优化了歌曲详情页右键按钮的表现
13. 【优化】优化了主窗口和歌词窗口的通信机制
14. 【修复】修复作者页歌曲显示不全的问题
15. 【修复】修复包含特殊字符时下载失败的问题
16. 【修复, macos】修复 macos 图标显示异常的问题
17. 【修复, linux】修复 linux 无法最小化的问题
18. 【打包】新增 windows 免安装版、mac m1/m2 版、linux 版
19. 【版本号】桌面版后缀取消 -alpha 后缀,以正式版本号发布。
`2023.9.5 v0.0.1-alpha.0`
1. 【功能】新增搜索历史记录
2. 【功能】新增下载歌词、调整歌词字体大小功能
3. 【功能】桌面歌词支持自定义字体
4. 【功能】支持选择音频输出设备
5. 【功能】下载歌曲功能
6. 【功能】设置中新增快捷键配置
7. 【功能】支持 windows8.1 及以下系统(下载链接中的 windows-legacy-setup.exe,win10/11 下载哪个 exe 都行)
8. 【优化】调整左下角歌曲信息的可响应区域
9. 【修复】修复本地歌曲只显示 100 首的问题
10. 【修复】修复 mac 系统无法移动桌面歌词的问题
11. 【修复】修复本地插件安装失败的问题
================================================
FILE: config/webpack.main.config.ts
================================================
import type { Configuration } from "webpack";
import path from "path";
import { rules } from "./webpack.rules";
export const mainConfig: Configuration = {
/**
* This is the main entry point for your application, it's the first file
* that runs in the main process.
*/
entry: {
index: "./src/main/index.ts",
},
// Put your normal webpack config below here
module: {
rules,
},
resolve: {
extensions: [".js", ".ts", ".jsx", ".tsx", ".css", ".json", '.node'],
alias: {
"@": path.join(__dirname, "../src"),
"@main": path.join(__dirname, "../src/main"),
"@native": path.join(__dirname, "../src/main/native_modules"),
"@shared": path.join(__dirname, "../src/shared")
},
},
output: {
filename: "[name].js",
},
externals: ['sharp']
};
================================================
FILE: config/webpack.plugins.ts
================================================
import type IForkTsCheckerWebpackPlugin from "fork-ts-checker-webpack-plugin";
// eslint-disable-next-line @typescript-eslint/no-var-requires
const ForkTsCheckerWebpackPlugin: typeof IForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
const relocateLoader = require("@vercel/webpack-asset-relocator-loader");
export const plugins = [
new ForkTsCheckerWebpackPlugin({
logger: "webpack-infrastructure",
}),
{
apply(compiler: any) {
compiler.hooks.compilation.tap(
"webpack-asset-relocator-loader",
(compilation: any) => {
relocateLoader.initAssetCache(compilation, "native_modules");
}
);
},
},
];
================================================
FILE: config/webpack.renderer.config.ts
================================================
import type { Configuration } from "webpack";
import path from "path";
import { rules } from "./webpack.rules";
import { plugins } from "./webpack.plugins";
rules.push(
{
test: /\.css$/,
use: [{ loader: "style-loader" }, { loader: "css-loader" }],
},
{
test: /\.scss$/,
use: [
{ loader: "style-loader" },
{ loader: "css-loader" },
{ loader: "sass-loader" },
],
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: "asset/resource",
},
{
test: /\.(png|jpg|jpeg|gif)$/i,
type: "asset/resource",
},
{
test: /\.svg$/,
use: [
{
loader: "@svgr/webpack",
options: {
prettier: false,
svgo: false,
svgoConfig: {
plugins: [{ removeViewBox: false }],
},
titleProp: true,
ref: true,
},
},
],
}
);
export const rendererConfig: Configuration = {
module: {
rules,
},
plugins,
resolve: {
extensions: [".js", ".ts", ".jsx", ".tsx", ".css", ".scss"],
alias: {
"@": path.join(__dirname, "../src"),
"@renderer": path.join(__dirname, "../src/renderer"),
"@renderer-lrc": path.join(__dirname, "../src/renderer-lrc"),
"@shared": path.join(__dirname, "../src/shared")
},
},
externals: process.platform !== "darwin" ? ["fsevents"] : undefined,
};
================================================
FILE: config/webpack.rules.ts
================================================
import type { ModuleOptions } from 'webpack';
export const rules: Required首先感谢你使用这款软件。开发这款软件的初衷首先是满足自己日常的需求,顺便分享出来,如果能对更多人有帮助那再好不过。
桌面版诞生于安卓版,在开发安卓版本的过程中逐渐发现有些地方的设计不合理,有些地方的代码也不太好,然后想到桌面版可以扩展出更多好玩的东西,所以趁着换工作的间隙,肝出了这个桌面版(的半成品)。安卓版本可以点击这里,后续如果有些更新可能会放在公众号上,也可以点个关注。(偶尔也会在公众号发一些技术文章,或者写个日记之类的,反正就随意吧)
本软件完全免费,并基于GPL协议开源,仅供学习参考使用,不可用于商业目的。代码地址: Github{" "} Gitee。
本软件仅仅是一个本地播放器,也可以通过插件扩展第三方源,插件可以完成包括播放、搜索在内的大部分功能;如果你是从第三方下载的插件,请一定谨慎识别这些插件的安全性,保护好自己。(注意:插件以及插件可能产生的数据与本软件无关,请使用者合理合法使用。)
还请注意本软件只是个人的业余项目,距离正式版也有很长一段距离。如果你在找成熟稳定的音乐软件,可以考虑其他优秀的软件。当然我会一直维护,让它变得尽可能的完善一些。业余时间用爱发电,进度慢还请见谅。如果你想帮忙提交代码或者开发一些功能,欢迎联系我(公众号留言/发邮件都行)。
最后,如果真的有人看到这里,希望这款软件可以帮到你,这也是这款软件存在的意义。
by: 猫头猫
{item}
))}|
{flexRender(
header.column.columnDef.header,
header.getContext(),
)}
{
e.stopPropagation();
}}
className={classNames({
resizer: true,
"resizer-resizing": header.column.getIsResizing(),
})}
> */}
|
))}
|---|
| {flexRender(cell.column.columnDef.cell, cell.getContext())} | ))}
{JSON.stringify(trackPlayer.currentMusic, null, 2)}
{error.message}
{error.stack && (
{error.stack}
)}
| {flexRender( header.column.columnDef.header, header.getContext(), )} | ))}
|---|
| {flexRender(cell.column.columnDef.cell, cell.getContext())} | ))}
| {flexRender( header.column.columnDef.header, header.getContext(), )} | ))}
|---|
| {flexRender(cell.column.columnDef.cell, cell.getContext())} | ))}