File: README.md
🌐 Language
软件介绍
zyfun是一款免费、极简、全能的跨平台影音管家,一站式管理 T1-T4 全类型资源,内置多核播放器随心切换。独家老板键,一键隐身摸鱼无忧。用观影发现世界!
展开查看软件截图
| 影视 | 直播 |
|---|---|
| 历史 | 播放 |
🌴 注意事项
- 仅此Github发布,请勿上当受骗;请各管理者不要宣传及引流本软件。
- 强烈倡导合法观影,本软件仅作为播放工具,不涉及资源存储或分发。
- 仅供个人学习交流之用,24小时内请自觉卸载,勿作商业用途。
- 前身来源于ZY-Player,图标由@fourbeauty设计。
- 在开始使用前,请务必详读并同意用户协议,确保遵守相关规定。
💻 跨平台说明
- MacOS:
- 数据库/文件/插件/日志 路径:
~/Library/Application Support/zyfun/ - 二进制 路径:
~/.zy/bin/
- 数据库/文件/插件/日志 路径:
- Linux:
- 数据库/文件/插件/日志 路径:
~/.config/zyfun/ - 二进制 路径:
~/.zy/bin/
- 数据库/文件/插件/日志 路径:
- Windows:
- 数据库/文件/插件/日志 路径:
%USERPROFILE%\AppData\Roaming\zyfun\ - 二进制 路径:
%USERPROFILE%\.zy\bin\
- 数据库/文件/插件/日志 路径:
🛠️ 下载安装
开发版下载: 需登录Github账号
最低要求: 和chromium内核要求保持一致
| 操作系统 | x64 | arm64 | loong64 | 发行版 | 开发版 | 最低要求 |
|---|---|---|---|---|---|---|
| Windows | ✅ | ✅ | ➖ | GitHub | GitHub | >= win10 |
| MacOS | ✅ | ✅ | ➖ | GitHub | GitHub | >= macOS12 |
| Linux | ✅ | ✅ | ❌ | GitHub 如意玲珑应用商店 AUR软件包 | GitHub | |
| Harmony | ❌ | ❌ | ➖ |
展开查看安装问题
MacOS 安装后打开提示「文件已损坏」
sudo spctl --master-disable
sudo xattr -cr /Applications/zyfun.appLinux Appimage运行失败
Running as root without --no-sandbox is not supported
./zyfun.AppImage --no-sandboxdlopen():error loading libfuse.so.2
sudo apt-get install libfuse2Exiting GPU process due to errors during initialization
xhost +Linux deb包安装失败
Package libnss3-1d is not installed
sudo apt-get install libnss3-1dPackage libxss1 is not installed
sudo apt-get install libxss1Linux rpm包安装失败
Dependency check failed libXScrnSaver is needed
sudo yum install epel-release
sudo yum install libXScrnSaverDependency check failed xdg-utils is needed
sudo yum install xdg-utils📚 数据结构
请严格按照数据结构导入数据, 避免不必要的报错(如数据字段类型不匹配)
展开查看接口说明
/* Detailed source-code truncated for AI context efficiency. */🤝 参与贡献
以下是您可以做出贡献的一些方式:
- 贡献代码:开发新功能或优化现有代码 <开发文档> <Mcp文档>
- 修复错误:提交您发现的任何错误的修复 <提交规范>
- 维护问题:帮助管理GitHub问题
- 产品设计:参与设计讨论
- 编写文档:改进用户手册和指南
- 社区参与:加入讨论并帮助用户
🌟 Star历史
💰 金主爸爸
- NodeSupport 赞助了本项目
File: docs/Conventional_Commits.md
结构
提交信息由 三部分组成:
- 标题 (Header):简洁描述此次更改内容。
- 正文 (Body):详细说明更改的背景、原因、以及具体改动(可选)。
- 页脚 (Footer):用于补充关联任务或备注信息(如关闭的 issue 编号或重大变更提醒)。
基本格式:
<type>(<scope>): <subject>
<footer>1. 标题格式
<type>(<scope>): <subject>type(必填):本次提交的更改类型,明确表明变更的性质。scope(可选):本次变更影响的范围(模块、功能、文件等)。subject(必填):简要描述更改内容,控制在 50 个字符以内,语句开头小写,不加句号。
type 的取值:
feat:新功能(feature)。fix:修复 bug。docs:文档相关(如 README、注释)。style:代码格式化(不影响代码逻辑)。refactor:代码重构(既不修 bug 也不加功能)。perf:性能优化。test:增加或修改测试用例。build:构建系统或外部依赖相关(如修改 package.json)。ci:修改 CI 配置或脚本。chore:不修改代码的杂务(如更改构建流程、配置文件)。revert:回滚提交。
示例:
feat(auth): 添加用户登录功能
fix(cart): 修复购物车价格计算错误
docs: 更新 API 文档
style: 格式化代码
refactor(core): 优化数据处理逻辑2. 正文格式
正文用于详细说明本次更改的背景和原因,建议包括以下内容:
- 改变的动机(Why)。
- 具体改动内容(What)。
- 改动的影响(Impact)。
书写规范:
- 每行控制在 72 个字符以内。
- 使用英文句子结构(推荐),或者简洁的中文描述。
示例:
fix(cart): 修复购物车价格计算错误
- 修复了当购物车有多个商品时,价格计算不正确的问题。
- 原因是数量累加逻辑未考虑浮点数运算的精度。3.页脚格式
页脚用于补充重要信息,例如:
- 关闭的 Issue:
Closes #123- 重大变更:
BREAKING CHANGE: 重命名了用户认证接口 `/auth` 为 `/user/auth`。- 其他备注:
示例:
feat(user): 添加用户注册功能
实现了用户通过邮箱注册的功能,并进行了基础验证。
未来将进一步支持手机号注册。
BREAKING CHANGE: 用户模型字段 `username` 已改为 `userName`。
Closes #45完整示例
feat(auth): 添加用户登录功能
支持通过邮箱和密码登录,并返回 JWT token。
未来版本将支持 OAuth 登录。
BREAKING CHANGE: API 接口 `/api/v1/login` 改为 `/api/v2/auth/login`。
Closes #101使用工具强制规范
commitlint:检查提交信息是否符合规范。husky:在提交前(如 pre-commit 或 commit-msg 阶段)自动检查提交信息。
配置步骤:
- 安装依赖:
yarn add -D @commitlint/config-conventional @commitlint/cli husky- 创建 commitlint.config.js 文件:
export default {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test', 'types'],
],
},
};- 启用 husky 钩子:
yarn husky install创建 commit-msg 钩子文件:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx --no-install commitlint --edit "$1"然后使脚本可执行:
chmod +x .husky/commit-msg- 验证提交信息: 当提交的消息不符合规范时,Git 会报错并中断提交流程。
使用 Angular 提交规范可以提高项目协作的效率,并为版本管理和自动化工具(如 Semantic Release)提供基础支持。
也可以使用simple-git-hooks
File: docs/Develop.md
🖥️ Develop
IDE Setup
VSCode like
- Editor: VS Code, etc. Any VS Code compatible editor.
- Recommended extensions are listed in
.vscode/extensions.json.
Project Setup
Install
pnpm installDevelopment
Setup Rust
Download rust-lang and install
Setup Node.js
The required Node.js version is defined in .node-version. Use a version manager like nvm or fnm to install it automatically:
nvm installSetup pnpm
The pnpm version is locked in the packageManager field of package.json. Just enable corepack and it will use the correct version automatically:
corepack enableInstall Dependencies
pnpm installENV
cp .env.example .envStart
pnpm devDebug
pnpm debugThen input chrome://inspect in browser
Test
pnpm testBuild
# For windows
$ pnpm build:win
# For macOS
$ pnpm build:mac
# For Linux
$ pnpm build:linuxFile: docs/HarmonyOS_Electron.md
HarmonyOS Electron 快速上手指南
本指南将帮助您在 30 分钟内快速上手 HarmonyOS Electron 开发。
📋 准备清单
开发环境
- DevEco Studio 4.0+
- HarmonyOS SDK API Level 10+
- Node.js 16.x+
- 鸿蒙设备或模拟器
必需文件
- Electron 应用源码或编译产物
- 开发者证书(可选,用于签名)
🚀 5 分钟快速开始
步骤 1: 克隆项目
git clone https://github.com/ohosvscode/ohos_electron_hap.git
cd ohos_electron_hap步骤 2: 添加 Electron 应用
将您的 Electron 应用代码放入:
web_engine/src/main/resources/resfile/resources/app/步骤 3: 构建运行
- 用 DevEco Studio 打开项目
- 点击 Build → Build Hap(s)
- 点击运行按钮安装到设备
🎉 恭喜!您的第一个鸿蒙 Electron 应用已经运行起来了!
📖 详细配置教程
自定义应用信息
修改应用名称
编辑 electron/src/main/resources/zh_CN/element/string.json:
{
"string": [
{
"name": "EntryAbility_label",
"value": "我的鸿蒙应用"
}
]
}替换应用图标
- 准备图标文件(建议 512x512 PNG)
- 替换
AppScope/resources/base/media/app_icon.png - 重新构建应用
设置启动窗口
编辑 electron/src/main/module.json5,在 abilities 中添加:
"metadata": [
{
"name": "ohos.ability.window.width",
"value": "1200"
},
{
"name": "ohos.ability.window.height",
"value": "800"
},
{
"name": "ohos.ability.window.left",
"value": "center"
},
{
"name": "ohos.ability.window.top",
"value": "center"
}
]权限配置
基础权限(自动获得)
这些权限会自动获得,无需特殊申请:
- 网络访问
- 获取网络信息
- 后台运行
- 读取剪贴板
需要申请的权限
编辑 web_engine/src/main/module.json5,在 requestPermissions 中添加:
{
"name": "ohos.permission.CAMERA",
"reason": "$string:camera_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}常用权限列表:
ohos.permission.CAMERA- 相机ohos.permission.MICROPHONE- 麦克风ohos.permission.LOCATION- 位置ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY- 下载目录
应用签名
申请开发者证书
- 访问 华为开发者联盟
- 注册开发者账号
- 申请 HarmonyOS 应用签名证书
配置签名
- 在 DevEco Studio 中选择 File → Project Structure
- 选择 Signing Configs
- 配置证书文件和密码
- 重新构建生成已签名 HAP
💡 实用示例
示例 1: 创建悬浮窗
const { BrowserWindow } = require('electron');
function createFloatWindow() {
const floatWindow = new BrowserWindow({
windowInfo: {
type: 'floatWindow',
},
width: 400,
height: 300,
transparent: true,
opacity: 0.9,
frame: false,
alwaysOnTop: true,
});
floatWindow.loadURL('https://www.example.com');
return floatWindow;
}示例 2: 请求系统权限
const { systemPreferences } = require('electron');
async function requestPermissions() {
// 请求相机权限
const cameraGranted = await systemPreferences.requestSystemPermission('camera');
console.log('相机权限:', cameraGranted ? '已授权' : '被拒绝');
// 请求麦克风权限
const micGranted = await systemPreferences.requestSystemPermission('microphone');
console.log('麦克风权限:', micGranted ? '已授权' : '被拒绝');
// 请求目录访问权限
const dirGranted = await systemPreferences.requestDirectoryPermission(null);
console.log('目录权限:', dirGranted ? '已授权' : '被拒绝');
}
// 在应用启动时调用
app.whenReady().then(requestPermissions);示例 3: 检查权限状态
const { systemPreferences } = require('electron');
function checkPermissionStatus() {
const cameraStatus = systemPreferences.getMediaAccessStatus('camera');
const micStatus = systemPreferences.getMediaAccessStatus('microphone');
console.log('权限状态:', {
camera: cameraStatus, // 'granted', 'denied', 'not-determined'
microphone: micStatus,
});
}🛠️ 调试技巧
渲染进程调试
// 在主进程中
const { BrowserWindow } = require('electron');
const win = new BrowserWindow({
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
},
});
// 打开开发者工具
win.webContents.openDevTools();主进程调试
1. 启用调试模式
编辑 web_engine/src/main/ets/components/WebWindow.ets:
// 添加调试参数
let inspect = '--inspect=9229';
let vec_args = [
'--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
resDir,
inspect, // 添加这行
];2. 配置端口转发
hdc fport tcp:9229 tcp:92293. Chrome 调试
- 在 Chrome 中访问:
chrome://inspect - 点击 "Configure..." 添加
localhost:9229 - 启动应用后点击 "inspect" 开始调试
🔧 常见问题解决
问题 1: 构建失败 "找不到 SO 库"
解决方案:
- 检查
electron/libs/arm64-v8a/目录是否存在 - 确认 5 个 SO 文件都已正确放置
- 检查文件权限
问题 2: 应用启动崩溃
解决方案:
- 检查 Electron 应用代码是否放在正确位置
- 确认应用代码已正确编译(如 TypeScript → JavaScript)
- 查看 DevEco Studio 的日志输出
问题 3: 权限被拒绝
解决方案:
- 检查
module.json5中的权限声明 - 确认已正确调用权限请求 API
- 对于 ACL 权限,确认已申请相应证书
问题 4: 三方库不兼容
解决方案:
// 检查平台
if (process.platform === 'ohos') {
// 鸿蒙平台特殊处理
console.log('运行在 HarmonyOS 上');
}
// 替换不兼容的库
const fs = process.platform === 'ohos' ? require('./ohos-fs-polyfill') : require('fs');📚 进阶学习
了解鸿蒙文件系统
// 应用数据目录
const userDataPath = '/data/storage/el2/base/files';
const tempPath = '/data/storage/el2/base/temp';
const cachePath = '/data/storage/el2/base/cache';
// 使用 Electron API
const { app } = require('electron');
console.log('用户数据目录:', app.getPath('userData'));
console.log('临时目录:', app.getPath('temp'));性能优化建议
- 预加载重要资源: 将常用文件放在应用包内
- 合理使用权限: 只申请必需的权限
- 优化启动时间: 减少首屏加载资源
- 内存管理: 及时释放不用的窗口和资源
发布准备
- 测试各种权限场景
- 验证多窗口功能
- 检查应用图标和名称
- 准备应用商店描述
🎯 下一步
- 💬 加入开发者社区交流
需要帮助?
- 📖 查看完整文档
- 🐛 提交 Issue
- 💬 联系维护团队
祝您开发愉快!🎉
File: docs/Loong_Electron.md
Loong Electron 快速上手指南
本指南将帮助您在 5 分钟内快速上手 Loong Electron 开发。
步骤 1: 安装npm管理工具。
#!/bin/bash
pkgsource=http://ftp.loongnix.cn/nodejs/LoongArch/dist/v20.8.0/node-v20.8.0-linux-loong64.tar.gz
[ -f $(basename $pkgsource) ] || wget $pkgsource
sudo mkdir -p /opt/nodejs
sudo tar --strip-components=1 -C /opt/nodejs -xvf $(basename $pkgsource)
sudo tee /etc/profile.d/nodejs.sh << "EOF"
export PATH=/opt/nodejs/bin:$PATH
export C_INCLUDE_PATH=/opt/nodejs/include:$C_INCLUDE_PATH
EOFsudo bash install_npm.sh
source /etc/profile.d/nodejs.sh步骤 2: 安装Electron
由于loongarch环境的electron官方没有编译对应的版本。
因此需要ELECTRON_MIRROR指定龙芯镜像源。同时设置electron_use_remote_checksums=1不检查校验文件。
#!/bin/bash
export electron_use_remote_checksums=1
if [ "$(arch)" == "loongarch" ];then
export ELECTRON_MIRROR="http://ftp.loongnix.cn/electron/LoongArch/"
else
export ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
fi
npm install [email protected] -g --unsafe-perm=true --allow-root
npm info -g electronsudo bash install_electron.sh💡 程序示例
步骤 1: 下载源码及安装依赖
git clone https://github.com/electron/electron-quick-start
cd electron-quick-start
npm install步骤 2: 编译打包
npm install --save-dev @electron-forge/cli
npx electron-forge import
npm run make
sudo dpkg -i /home/$HOME/electron-quick-start/out/make/deb/x64/electron-quick-start_1.0.0_amd64.debFile: docs/Mcp.md
Mcp
debug-electron-mcp
{
"debug-electron-mcp": {
"args": ["-y", "@debugelectron/debug-electron-mcp@latest"],
"command": "npx"
}
}swagger-mcp
{
"swagger-mcp": {
"args": ["-y", "swagger-mcp@latest"],
"command": "npx",
"env": {
"API_BASE_URL": "http://127.0.0.1:9978",
"API_DOCS_URL": "http://127.0.0.1:9978/docs/json"
}
}
}tdesign-mcp
{
"tdesign-mcp-server": {
"args": ["-y", "tdesign-mcp-server"],
"command": "npx"
}
}File: src/renderer/src/components/multi-player/README.md
忽略dplayer/nplayer/oplayer说明 (已移除)
差异说明
- 解码器
- dash
- xgplayer: shaka(dash加载ranage为0)
- artplayer/oplayer/nplayer/dplayer: dash
- flv
- oplayer: mpegts
- artplayer/xgplayer/nplayer/dplayer: flv
- mpegts: oplayer/xgplayer不支持ts分片类型
- torrent: xgplayer不支持
- xgplayer: 解码器默认参数与其他不对齐(参数不一致)
- dash
- 请求头(不支持情况) -> 链接绑请求头 -> 底层拦截(electron)
- oplayer: dash/flv/shaka均不支持
- xgplayer: 仅m3u8/flv支持
- torrent: 均不支持
- shaka: 解码器只有第一次请求mpd存在请求头 m4s 不带请求头
- 记忆
- oplayer: 赋值音量与ui不对应(功能不影响) -> 静音直接显示0 但 赋值会显示赋值
- oplayer: 倍速/音量/静音记忆失效(偶发)
- 右键
- 支持: artplayer/dplayer/nplayer(不支持画质数据)
- 不支持: xgpayer/oplayer
- 音量
- artplayer/dplayer/oplayer/xgplayer: 静音显示0
- nplayer: 静音显示原音量
- artplayer: 静音点击音量条会提示音量变动但是ui没渲染实际也是静音, 拖动直接恢复
- 弹幕
- dplayer: 弹幕使用 url+blob / apiBackend
- dplayer: 弹幕发布无法控制底部距离
- oplayer: 渲染有问题获取不到图层真实尺寸
- 国际化
- artplayer/dplayer/nplayer/xgplayer: 支持 简体/繁体/英语
- oplayer: 不支持繁体
- artplayer: 弹幕部分只支持简体
- 画质
- nplayer: 不支持多画质
- 切换
- 解码器
- dplayer/nplayer/oplayer/xgplayer: 跨解码器切换链接
- artplayer: 同解码器切换链接
- 请求头
- artplayer/dplayer/nplayer/xgplayer: 可切请求头
- oplayer: 不可切请求头
- xgplayer 切换 mpd 失败
- dplayer 切换 mpd 会提示加载失败, 实际加载了
- 解码器
- 其他
- nplayer: 一旦 startTime 超过总时长会报错
- nplayer: 摧毁后重建会丢失插件 pip 和 playNext, 刷新生效
- 解码器
参数
- container: 容器id不带#
- type: 解码器类型 hls dash flv mpegts torrent mp4
- url: 视频地址
- quality: 视频质量 { name, url }
- headers: 请求头
- autoplay: 自动播放
- isLive: 直播
- startTime: 开始时间,单位秒
- next: 下集按钮
方法
- barrage: 弹幕
- create: 创建播放器
- destroy: 摧毁播放器
- onTimeUpdate: 实时返回时间
- play: 播放
- pause: 暂停
- togglePlay: 播放/暂停
- toggleMuted: 切换静音
- time: 视频时间<当前播放时间, 总进度时间>
- seek: 跳转
- playbackRate: 当前倍速
- setPlaybackRate: 设置倍速
- muted: 当前静音
- setMuted: 设置静音
- volume: 当前音量
- setVolume: 设置音量
插槽
- header: 头部插槽
mediaUtils
- checkMediaType: 检测媒体类型
- removeUnSafeHeaders: 移除不安全请求头
- convertStandardToUri: 请求头转url拼接
- convertWebToElectron: web不安全请求头转electron请求头
- getExtensionFromMime: 获取文件扩展名-根据Mime
- getMimeFromExtension: 获取Mime-根据扩展名
- getFileExtension: 获取文件扩展名-根据路径
- getStreamContentTypeToExtension: 获取媒体类型-根据网络流ContentType
- getDecoderFromExtension: 获取媒体对应解码器
- getStreamContentType: 获取ContentType
- isHEVCVideoSupported: 检查是否支持hevc
- isSafeHeader: 检查请求头 key 是否安全