阶段2:拆分为 ES Module + Rollup 构建,重写 README

- src/ 下拆分为入口/语言包/默认配置/主函数/工具模块,主函数整体搬入零改动
- rollup 打包 UMD(moeplayer.js + moeplayer.min.js),用户使用方式不变
- 库拷贝逻辑移至 scripts/copy-libs.js
- README 重写:中文文档、快速开始、路线图、致谢原作者
- index.html 增加皮肤切换演示(默认/红色/西瓜)
This commit is contained in:
王阳
2026-07-21 11:16:25 +08:00
parent 5609532c80
commit 159603341e
19 changed files with 15507 additions and 7406 deletions
+20 -11
View File
@@ -6,17 +6,24 @@ MoePlayer —— 一款中文友好的开源网页视频播放器(MIT 协议
目标定位:中文文档 + 主流浏览器/手机 H5 支持 + 官方 Moodle media 插件(`media_moeplayer`,独立仓库)。
**注意**:当前处于改造阶段 2(改名 + 模块化)。改名已完成:目录 `moeplayer/`、全局变量/API 为 `MoePlayer`(语言包全局变量 `moeplayerLanguage`);单文件拆分为 ES Module 待做
**注意**:当前处于改造阶段 2(改名 + 模块化)。改名已完成:目录 `moeplayer/`、全局变量/API 为 `MoePlayer`(语言包全局变量 `moeplayerLanguage`);单文件拆分为 ES Module(源码在 `src/`,经 rollup 打包为 UMD 产物)。**主函数 `moeplayerEmbed` 尚未内部拆分**,仍是一个 ~6400 行的巨大函数,位于 `src/core/moeplayerEmbed.js`
## 目录结构
```
├── index.html # 演示/测试页(含 API 调用示例)
├── package.json # npm 工程化入口,依赖与构建脚本
├── scripts/build.js # 构建脚本:压缩核心 + 从 node_modules 拷贝运行时库
├── rollup.config.js # rollup 配置:src/ 打包为 UMD 产物 + terser 压缩
├── scripts/copy-libs.js # 构建脚本第二步:从 node_modules 拷贝运行时库
├── src/ # 播放器源码(ES Module,2026-07 由单文件拆分而来)
│ ├── index.js # 入口:export default moeplayerEmbed
│ ├── language.js # 默认中文语言包
│ ├── defaults.js # videoObjectDefault 默认配置
│ ├── core/moeplayerEmbed.js # 主函数,【整体搬自旧单文件,内部未拆分,逻辑零改动】
│ └── utils/ # 工具函数:type/dom/format/net/cookie/path
├── moeplayer/ # 播放器本体,部署时整个上传到网站
│ ├── js/moeplayer.js # 核心源码(UMD 模块,~7400 行,ES5
│ ├── js/moeplayer.min.js # 压缩版,【由 npm run build 自动生成,勿手改】
│ ├── js/moeplayer.js # UMD 产物,【由 npm run build 自动生成,勿手改】
│ ├── js/moeplayer.min.js # 压缩版,同上
│ ├── css/moeplayer.css # 默认皮肤;另有 moeplayer.red.css、moeplayer.ixigua.css
│ ├── css/images/ # 皮肤图片资源
│ ├── language/ # 语言包:zh.cn.js(默认内嵌)、zh.hk.js、en.js
@@ -29,12 +36,13 @@ MoePlayer —— 一款中文友好的开源网页视频播放器(MIT 协议
## 构建与依赖
- 安装:`npm install`
- 构建:`npm run build` —— 做两件事:
1. terser 压缩 `moeplayer/js/moeplayer.js``moeplayer.min.js`
2. 从 node_modules 拷贝 hls.js / flv.js / mpegts.js 的产物及 LICENSE 到 `moeplayer/` 对应目录
- **改动 `moeplayer.js` 后必须执行 `npm run build`** 重新生成 min 版
- 构建:`npm run build`(即 `rollup -c && node scripts/copy-libs.js`) —— 做两件事:
1. rollup 把 `src/` 的 ES Module 打包为 UMD`moeplayer/js/moeplayer.js`,并经 @rollup/plugin-terser 生成 `moeplayer.min.js`(保留 `软件名称|版权` 头部注释)
2. `scripts/copy-libs.js` 从 node_modules 拷贝 hls.js / flv.js / mpegts.js 的产物及 LICENSE 到 `moeplayer/` 对应目录
- **改动 `src/` 后必须执行 `npm run build`** 重新生成两个产物;`moeplayer/js/` 下两个 js 均为生成物,勿手改
- 升级依赖:改 `package.json` 版本号后 `npm install && npm run build`
- 运行时机制:播放器用 `getPath()` 定位自身所在目录,按需动态 `<script>` 加载同级 `hls.js/` 等目录里的文件,库挂全局变量(`Hls`/`flvjs`/`mpegts`)。**这个目录结构约定不能破坏**
- rollup 配置要点:`treeshake: false`(完整保留所有工具函数,与旧单文件一致);UMD `name: 'MoePlayer'``exports: 'default'`,CJS/AMD/全局变量行为与旧 UMD 等价
## 测试方式
@@ -43,8 +51,9 @@ MoePlayer —— 一款中文友好的开源网页视频播放器(MIT 协议
## 代码风格
- 注释与文档使用中文(项目惯例)
- 核心源码为单文件 ES5 风格(`var`、函数式)阶段 2/3 重构前保持一致,不要引入 ES6+ 语法
- `moeplayer/` 下由构建生成的文件(min.js、hls.js/flv.js/mpegts.js 目录内容)不要手动修改
- `src/` 为 ES Module 源码,但函数体保持旧单文件 ES5 风格(`var`、函数式),阶段 2/3 重构前不要在函数体内引入 ES6+ 语法;只允许模块级的 `import`/`export` 语句
- 主函数 `moeplayerEmbed` 整体搬迁、内部逻辑零改动;语言包替换机制(`window.moeplayerLanguage`)在其内部,勿动
- `moeplayer/` 下由构建生成的文件(js 两个产物、hls.js/flv.js/mpegts.js 目录内容)不要手动修改
## Git 约定
@@ -54,7 +63,7 @@ MoePlayer —— 一款中文友好的开源网页视频播放器(MIT 协议
## 改造路线图
1. ~~工程化:npm + 构建脚本 + 依赖 npm 化~~(已完成)
2. 改名 ckplayer → MoePlayer(已完成)+ 单文件拆分为 ES Module(待做+ README 重写
2. 改名 ckplayer → MoePlayer(已完成)+ 单文件拆分为 ES Module(已完成,`src/` + rollup 打包;主函数 `moeplayerEmbed` 内部尚未拆分+ README 重写
3. 核心与 UI 分层、皮肤改用 CSS 变量 + SVG 图标
4. 协议插件化(hls/mpegts 按需加载,移除 flv.js)、移动端 H5 兼容专项
5. Moodle media 插件(独立仓库 moodle-media_moeplayer
+54 -24
View File
@@ -1,42 +1,72 @@
#### 介绍
一款用于在网页上播放视频的软件,本软件为开源软件,遵守开源协议:MIT
# MoePlayer
#### 视频格式支持
支持mp4,flv,m3u8,ts等格式
一款中文友好的开源网页视频播放器(MIT 协议),fork 自已停止维护的 [ckplayer](http://www.ckplayer.com) X3,在其基础上持续现代化改造。
#### 播放形式支持
支持点播、直播、直播+回放
> 本项目处于活跃改造期,API 与 ckplayer X3 基本兼容,但全局变量已更名为 `MoePlayer`CSS 类名前缀已更名为 `moeplayer-*`。
#### 平台支持
支持移动端,PC端。
## 特性
#### 功能支持
支持使用js监听播放器的各种状态,支持使用js控制播放器的各种操作
- 支持 mp4 / flv / m3u8 / ts 等格式(m3u8/flv/ts 基于 hls.js、flv.js、mpegts.js
- 支持点播、直播、直播+回放
- 支持 PC 与移动端 H5
- 支持使用 JS 监听播放器各种状态、控制播放器各种操作
- 零框架依赖,引入一个 JS 和一个 CSS 即可使用
- 多实例友好:同一页面可创建多个播放器
#### 软件架构
本软件采用javascript编写核心代码,css文件定义播放器风格
## 快速开始
#### 安装教程
不存在安装过程,将下载包里的ckplayer文件夹上传到网站环境中,在需要播放视频的页面上引入ckplayer.js及ckplayer.css文件,在需要插入视频的地方使用如下代码:
`moeplayer` 文件夹上传到网站环境中,在页面引入 `moeplayer.js``moeplayer.css`
```
<link type="text/css" rel="stylesheet" href="ckplayer/css/ckplayer.css" />
<script type="text/javascript" src="ckplayer/js/ckplayer.js" charset="UTF-8"></script>
```html
<link type="text/css" rel="stylesheet" href="moeplayer/css/moeplayer.css" />
<script type="text/javascript" src="moeplayer/js/moeplayer.min.js" charset="UTF-8"></script>
<div class="video" style="width: 600px;height: 400px;">播放器容器</div>
<script type="text/javascript">
//定义一个变量:videoObject,用来做为视频初始化配置
var videoObject = {
container: '.video', //“#”代表容器的ID,“.”或“”代表容器的class
video: 'http://ckplayer-video.oss-cn-shanghai.aliyuncs.com/sample-mp4/05cacb4e02f9d9e.mp4'//视频地址
video: 'https://example.com/sample.mp4' //视频地址
};
var player = new ckplayer(videoObject);//初始化播放器
var player = new MoePlayer(videoObject); //初始化播放器
</script>
```
更多配置与 API 可参考本仓库的 `index.html` 演示页;原 ckplayer 手册(http://www.ckplayer.com/manual/ )在改造期内仍有参考价值。
#### 使用说明
使用过程中碰到问题,请至官网查看手册:http://www.ckplayer.com/manual/
### 语言
#### 参与贡献
niandeng
默认中文。引入语言包可切换其它语言(需在引入 moeplayer.js 之前引入):
```html
<script type="text/javascript" src="moeplayer/language/en.js" charset="UTF-8"></script>
```
### 皮肤
默认皮肤 `moeplayer.css`,另有红色 `moeplayer.red.css`、西瓜风格 `moeplayer.ixigua.css`,替换 CSS 文件即可换肤。
## 从源码构建
```bash
npm install
npm run build
```
源码在 `src/`(ES Module),构建产物输出到 `moeplayer/js/`(UMD,含未压缩版与 min 版),同时从 npm 依赖拷贝 hls.js / flv.js / mpegts.js 运行时库到 `moeplayer/` 对应目录。
## 改造路线图
- [x] 工程化:npm + rollup 构建,依赖 npm 化管理
- [x] 改名 ckplayer → MoePlayer,单文件拆分为 ES Module
- [ ] 核心与 UI 分层,皮肤改用 CSS 变量 + SVG 图标
- [ ] 协议插件化(hls/mpegts 按需加载,移除已停维护的 flv.js)
- [ ] 移动端 H5 兼容性专项
- [ ] Moodle media 插件(独立仓库 moodle-media_moeplayer
- [ ] 完整中文文档
## 致谢
感谢 ckplayer 原作者 [niandeng](http://www.ckplayer.com) 的开源工作,本项目在其 X3 版本基础上继续演进。
## 协议
[MIT](LICENSE) © MoePlayer 项目 & ckplayer 原作者 niandeng
+11 -1
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<title>MoePlayer</title>
<link type="text/css" rel="stylesheet" href="moeplayer/css/moeplayer.css" />
<link id="skin" type="text/css" rel="stylesheet" href="moeplayer/css/moeplayer.css" />
<!--
如果需要使用其它语言,请在此处引入相应的js,比如:<script type="text/javascript" src="moeplayer/language/en.js" charset="UTF-8"></script>
-->
@@ -44,12 +44,22 @@
player.ended(function(){
document.getElementById('state').innerHTML='监听到播放结束';
});
//皮肤切换:替换引入的CSS文件
function changeSkin(css){
document.getElementById('skin').href='moeplayer/css/'+css;
}
</script>
<p>以下链接指向原 ckplayer 项目:</p>
<p>官网:<a href="https://www.ckplayer.com" target="_blank">www.ckplayer.com</a></p>
<p>手册:<a href="https://www.ckplayer.com/manual/" target="_blank">www.ckplayer.com/manual/</a></p>
<p>社区:<a href="https://bbs.ckplayer.com/" target="_blank">bbs.ckplayer.com</a></p>
<p>全功能演示:<a href="https://www.ckplayer.com/demo.html" target="_blank">www.ckplayer.com/demo.html</a></p>
<p>皮肤切换:</p>
<p>
<button type="button" onclick="changeSkin('moeplayer.css')">默认</button>
<button type="button" onclick="changeSkin('moeplayer.red.css')">红色</button>
<button type="button" onclick="changeSkin('moeplayer.ixigua.css')">西瓜</button>
</p>
<p>控制示例:</p>
<p>
<button type="button" onclick="player.play()" >播放</button>
+7375 -7338
View File
File diff suppressed because it is too large Load Diff
+7 -1
View File
File diff suppressed because one or more lines are too long
+501 -1
View File
@@ -14,7 +14,8 @@
"mpegts.js": "^1.8.0"
},
"devDependencies": {
"terser": "^5.0.0"
"@rollup/plugin-terser": "^1.0.0",
"rollup": "^4.62.2"
}
},
"node_modules/@jridgewell/gen-mapping": {
@@ -67,6 +68,425 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@rollup/plugin-terser": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz",
"integrity": "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"serialize-javascript": "^7.0.3",
"smob": "^1.0.0",
"terser": "^5.17.4"
},
"engines": {
"node": ">=20.0.0"
},
"peerDependencies": {
"rollup": "^2.0.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
"integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz",
"integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz",
"integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz",
"integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz",
"integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz",
"integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz",
"integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==",
"cpu": [
"arm"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz",
"integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==",
"cpu": [
"arm"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz",
"integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz",
"integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz",
"integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==",
"cpu": [
"loong64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-loong64-musl": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz",
"integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==",
"cpu": [
"loong64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz",
"integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==",
"cpu": [
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-ppc64-musl": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz",
"integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==",
"cpu": [
"ppc64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz",
"integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==",
"cpu": [
"riscv64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz",
"integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==",
"cpu": [
"riscv64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz",
"integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==",
"cpu": [
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz",
"integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz",
"integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-openbsd-x64": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz",
"integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
]
},
"node_modules/@rollup/rollup-openharmony-arm64": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz",
"integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openharmony"
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz",
"integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz",
"integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz",
"integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz",
"integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@types/estree": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
"integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
"dev": true,
"license": "MIT"
},
"node_modules/acorn": {
"version": "8.17.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
@@ -110,6 +530,21 @@
"webworkify-webpack": "^2.1.5"
}
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/hls.js": {
"version": "1.6.16",
"resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.16.tgz",
@@ -126,6 +561,71 @@
"webworkify-webpack": "github:xqq/webworkify-webpack"
}
},
"node_modules/rollup": {
"version": "4.62.2",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz",
"integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.9"
},
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=18.0.0",
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.62.2",
"@rollup/rollup-android-arm64": "4.62.2",
"@rollup/rollup-darwin-arm64": "4.62.2",
"@rollup/rollup-darwin-x64": "4.62.2",
"@rollup/rollup-freebsd-arm64": "4.62.2",
"@rollup/rollup-freebsd-x64": "4.62.2",
"@rollup/rollup-linux-arm-gnueabihf": "4.62.2",
"@rollup/rollup-linux-arm-musleabihf": "4.62.2",
"@rollup/rollup-linux-arm64-gnu": "4.62.2",
"@rollup/rollup-linux-arm64-musl": "4.62.2",
"@rollup/rollup-linux-loong64-gnu": "4.62.2",
"@rollup/rollup-linux-loong64-musl": "4.62.2",
"@rollup/rollup-linux-ppc64-gnu": "4.62.2",
"@rollup/rollup-linux-ppc64-musl": "4.62.2",
"@rollup/rollup-linux-riscv64-gnu": "4.62.2",
"@rollup/rollup-linux-riscv64-musl": "4.62.2",
"@rollup/rollup-linux-s390x-gnu": "4.62.2",
"@rollup/rollup-linux-x64-gnu": "4.62.2",
"@rollup/rollup-linux-x64-musl": "4.62.2",
"@rollup/rollup-openbsd-x64": "4.62.2",
"@rollup/rollup-openharmony-arm64": "4.62.2",
"@rollup/rollup-win32-arm64-msvc": "4.62.2",
"@rollup/rollup-win32-ia32-msvc": "4.62.2",
"@rollup/rollup-win32-x64-gnu": "4.62.2",
"@rollup/rollup-win32-x64-msvc": "4.62.2",
"fsevents": "~2.3.2"
}
},
"node_modules/serialize-javascript": {
"version": "7.0.7",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.7.tgz",
"integrity": "sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=20.0.0"
}
},
"node_modules/smob": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz",
"integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20.0.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+3 -2
View File
@@ -4,7 +4,7 @@
"description": "一款中文友好的网页视频播放器(fork 自 ckplayer X3),支持 mp4/flv/m3u8/ts,可搭配 Moodle media 插件使用",
"license": "MIT",
"scripts": {
"build": "node scripts/build.js"
"build": "rollup -c && node scripts/copy-libs.js"
},
"dependencies": {
"flv.js": "^1.6.2",
@@ -12,6 +12,7 @@
"mpegts.js": "^1.8.0"
},
"devDependencies": {
"terser": "^5.0.0"
"@rollup/plugin-terser": "^1.0.0",
"rollup": "^4.62.2"
}
}
+49
View File
@@ -0,0 +1,49 @@
/*
* rollup 构建配置
* 功能 src/ 下的 ES Module 打包成与旧版等价的 UMD 产物
* 1. moeplayer/js/moeplayer.js 未压缩版
* 2. moeplayer/js/moeplayer.min.js terser 压缩版(保留版权注释)
* 运行时依赖(hls.js/flv.js/mpegts.js)的拷贝由 scripts/copy-libs.js 完成
* 用法npm run build
*/
import terser from '@rollup/plugin-terser';
// 产物头部版权注释(与 src/index.js 顶部一致)
const banner = `/*
* 软件名称MoePlayer
* 版本:X3
* 版权MoePlayer 项目(fork ckplayer, www.ckplayer.com)
* 开源协议MIT
*/`;
const outputBase = {
format: 'umd',
name: 'MoePlayer',
// 仅导出 moeplayerEmbed 函数本身,与旧 UMD 的 module.exports = factory() 行为一致
exports: 'default',
banner
};
export default {
input: 'src/index.js',
// 关闭 tree-shaking:完整保留所有工具函数(含暂未被引用的),与旧单文件内容一致
treeshake: false,
output: [
{
...outputBase,
file: 'moeplayer/js/moeplayer.js'
},
{
...outputBase,
file: 'moeplayer/js/moeplayer.min.js',
plugins: [
terser({
format: {
// 保留文件头部的版权注释
comments: /^!|软件名称|版权/
}
})
]
}
]
};
+9 -29
View File
@@ -1,14 +1,12 @@
/*
* 构建脚本
* 功能
* 1. 使用 terser moeplayer/js/moeplayer.js 压缩为 moeplayer.min.js
* 2. node_modules 拷贝运行时依赖(hls.js/flv.js/mpegts.js) moeplayer/ 对应目录
* 构建脚本(第二步)
* 功能 node_modules 拷贝运行时依赖(hls.js/flv.js/mpegts.js) moeplayer/ 对应目录
* 播放器运行时会按需动态加载这些文件,目录结构需与 getPath() 的约定保持一致
* 用法npm run build
* 第一步(rollup 打包压缩) rollup.config.js
* 用法npm run build( rollup -c && node scripts/copy-libs.js)
*/
const fs = require('fs');
const path = require('path');
const terser = require('terser');
const root = path.resolve(__dirname, '..');
@@ -19,23 +17,6 @@ const libs = [
['mpegts.js', 'mpegts.js', ['mpegts.js', 'mpegts.js.map', 'LICENSE']]
];
async function minifyCore() {
const src = path.join(root, 'moeplayer/js/moeplayer.js');
const dist = path.join(root, 'moeplayer/js/moeplayer.min.js');
const code = fs.readFileSync(src, 'utf8');
const result = await terser.minify(code, {
output: {
// 保留文件头部的版权注释
comments: /^!|软件名称|版权/
}
});
if (result.error) {
throw result.error;
}
fs.writeFileSync(dist, result.code, 'utf8');
console.log('压缩完成: moeplayer/js/moeplayer.min.js (' + result.code.length + ' bytes)');
}
function copyLibs() {
for (const [pkg, dir, files] of libs) {
const pkgRoot = path.dirname(require.resolve(pkg + '/package.json'));
@@ -55,11 +36,10 @@ function copyLibs() {
}
}
(async () => {
await minifyCore();
try {
copyLibs();
console.log('构建完成');
})().catch(err => {
console.error('构建失败:', err);
console.log('依赖拷贝完成');
} catch (err) {
console.error('拷贝失败:', err);
process.exit(1);
});
}
File diff suppressed because it is too large Load Diff
+62
View File
@@ -0,0 +1,62 @@
/*
* videoObjectDefault
* 功能静态变量,默认播放配置当外部传递过来的配置有未包含在varsDefault里的则使用varsDefault里的配置
*/
var videoObjectDefault= {
container: '',//视频容器的ID
volume: 0.8,//默认音量,范围0-1
poster: '',//封面图片地址
autoplay: false,//是否自动播放
loop: false,//是否需要循环播放
live: false,//是否是直播
rotate:0,//视频旋转角度
zoom:0,//默认缩放比例
ad:null,//广告
backLive:false,//显示返回直播按钮
seek: 0,//默认需要跳转的秒数
next: null,//下一集按钮动作
loaded: '',//加载播放器后调用的函数
plug: '',//使用插件
duration:0,//视频总时间
preview: null,//预览图片对象
prompt: null,//提示点功能
crossOrigin:'',//跨域请求字符
video: null,//视频地址
type:'',//视频类型
playbackrate: 1,//默认倍速
ended:null,//结束显示的内容
webFull:false,//页面全屏按钮事件
theatre:null,//剧场模式
controls:false,//是否显示自带控制栏
rightBar:null,//是否开启右边控制栏
smallWindows:null,//是否启用小窗口模式
smallWindowsDrag:true,//当处于小窗口模式时是否可拖动播放器
screenshot:false,//截图功能是否开启
timeScheduleAdjust:1,//是否可调节播放进度,0不启用,1是启用,2是只能前进(向右拖动),3是只能后退,4是只能前进但能回到第一次拖动时的位置,5是看过的地方可以随意拖动
logo:'',//logo
menu:null,//右键菜单
information:{//关于
'Load:':'{loadTime} second',
'Duration:':'{duration} second',
'Size:':'{videoWidth}x{videoHeight}',
'Volume:':'{volume}%',
'Fps:':'{fps}fps',
'Sudio decoded:':'{audioDecodedByteCount} Byte',
'Video decoded:':'{videoDecodedByteCount} Byte'
},
track:null,//字幕
title:'',//视频标题
language:'',//语言包文件
barHideTime:1500,//控制栏隐藏时间
playbackrateOpen:true,//是否开启控制栏倍速选项
playbackrateList:[0.75,1,1.25,1.5,2,4],//倍速配置值
cookie:null,//开启cookie功能
domain:null,//指定cookie保存的域
cookiePath:'/',//指定cookie保存路径
documentFocusPause:false,//窗口失去焦点后暂停播放
mouseWheelVolume:2,//是否启用鼠标滚轮调节音量功能,0=不启用,1=启用,2=全屏时才启用
keyVolume:2,//是否启用键盘控制音量调节,0=不启用,1=启用,2=全屏时才启用
errorShow:true//是否显示错误信息
};
export { videoObjectDefault };
+9
View File
@@ -0,0 +1,9 @@
/*
* 软件名称MoePlayer
* 版本:X3
* 版权MoePlayer 项目(fork ckplayer, www.ckplayer.com)
* 开源协议MIT
*/
import moeplayerEmbed from './core/moeplayerEmbed.js';
export default moeplayerEmbed;
+69
View File
@@ -0,0 +1,69 @@
/*
* language
* 功能静态变量,包含播放器用到的默认语言包
* 引入其它语言js后该变量将被替换成新引入的语言包
*/
var language={
play:'%E6%92%AD%E6%94%BE',
pause:'%E6%9A%82%E5%81%9C',
refresh:'%E9%87%8D%E6%92%AD',
full:'%E5%85%A8%E5%B1%8F',
exitFull:'%E9%80%80%E5%87%BA%E5%85%A8%E5%B1%8F',
webFull:'%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F',
exitWebFull:'%E9%80%80%E5%87%BA%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F',
theatre:'%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F',
exitTheatre:'%E9%80%80%E5%87%BA%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F',
volume:'%E9%9F%B3%E9%87%8F%EF%BC%9A',
muted:'%E9%9D%99%E9%9F%B3',
exitmuted:'%E6%81%A2%E5%A4%8D%E9%9F%B3%E9%87%8F',
seek:'seek%EF%BC%9A',
waiting:'%E7%BC%93%E5%86%B2',
live:'%E7%9B%B4%E6%92%AD%E4%B8%AD',
backLive:'%E8%BF%94%E5%9B%9E%E7%9B%B4%E6%92%AD',
lookBack:'%E5%9B%9E%E7%9C%8B%EF%BC%9A',
next:'%E4%B8%8B%E4%B8%80%E9%9B%86',
screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE',
smallwindows:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E6%92%AD%E6%94%BE%E5%8A%9F%E8%83%BD',
playbackrate:'%E5%80%8D%E9%80%9F',
playbackrateSuffix:'%E5%80%8D',
track:'%E5%AD%97%E5%B9%95',
noTrack:'%E6%97%A0%E5%AD%97%E5%B9%95',
definition:'%E6%B8%85%E6%99%B0%E5%BA%A6',
switchTo:'%E5%88%87%E6%8D%A2%E6%88%90%EF%BC%9A',
closeTime:'%7Bseconds%7D%E7%A7%92%E5%90%8E%E5%8F%AF%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A',
closeAd:'%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A',
second:'%E7%A7%92',
details:'%E6%9F%A5%E7%9C%8B%E8%AF%A6%E6%83%85',
copy:'%E5%A4%8D%E5%88%B6',
copySucceeded:'%E5%A4%8D%E5%88%B6%E6%88%90%E5%8A%9F%EF%BC%8C%E5%8F%AF%E8%B4%B4%E7%B2%98%EF%BC%81',
smallwindowsOpen:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%BC%80%E5%90%AF',
smallwindowsClose:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD',
screenshotStart:'%E6%88%AA%E5%9B%BE%E4%B8%AD%EF%BC%8C%E8%AF%B7%E7%A8%8D%E5%80%99...',
screenshotClose:'%E6%88%AA%E5%9B%BE%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD',
loopOpen:'%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE',
loopClose:'%E5%B7%B2%E5%85%B3%E9%97%AD%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE',
close:'%E5%85%B3%E9%97%AD',
down:'%E4%B8%8B%E8%BD%BD',
p50:'50%25',
p75:'75%25',
p100:'100%25',
timeScheduleAdjust:{
prohibit:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%8B%96%E5%8A%A8',
prohibitBackOff:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E9%87%8D%E5%A4%8D%E8%A7%82%E7%9C%8B',
prohibitForward:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E5%BF%AB%E8%BF%9B',
prohibitLookBack:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9',
prohibitForwardNotViewed:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E6%9C%AA%E8%A7%82%E7%9C%8B%E7%9A%84%E9%83%A8%E5%88%86'
},
error:{
noMessage:'%E6%9C%AA%E7%9F%A5%E9%94%99%E8%AF%AF',
supportVideoError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E7%89%88%E6%9C%AC%E5%A4%AA%E4%BD%8E%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8',
videoTypeError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81%E6%92%AD%E6%94%BE%E8%AF%A5%E8%A7%86%E9%A2%91%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8',
loadingFailed:'%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5',
emptied:'%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF',
screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE%E5%A4%B1%E8%B4%A5',
ajax:'Ajax%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E9%94%99%E8%AF%AF',
noVideoContainer:'%E6%9C%AA%E6%89%BE%E5%88%B0%E6%94%BE%E7%BD%AE%E8%A7%86%E9%A2%91%E7%9A%84%E5%AE%B9%E5%99%A8'
}
};
export { language };
+64
View File
@@ -0,0 +1,64 @@
import { isUndefined } from './type.js';
/*
* cookie
* 功能操作cookie
*/
function cookie(name,value,domain,path){
if(isUndefined(domain)){
domain='';
}
if(isUndefined(path)){
path='/';
}
var ckStr=';domain='+domain+';path='+path;
if(location.protocol=='https'){
ckStr+=';SameSite=None;Secure=true';
}
var set=function(name,value){
var time = 360*24*60*60*1000;
var exp = new Date();
exp.setTime(exp.getTime() + time);
try{
document.cookie = name + '='+ escape (value) + ';expires=' + exp.toGMTString()+ckStr;
}
catch(event){console.error(event)}
},
get=function(name){
var arr,reg=new RegExp('(^| )'+name+'=([^;]*)(;|$)');
if(arr=document.cookie.match(reg)){
return unescape(arr[2]);
}
else{
return null;
}
},
del=function(name){
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval=get(name);
if(cval!=null){
document.cookie= name + '='+cval+';expires='+exp.toGMTString()+ckStr;
}
};
if(!isUndefined(name) && !isUndefined(value)){
if(value=='delete'){
del(name);
return null;
}
else{
set(name,value);
return get(name);
}
}
else if(!isUndefined(name) && isUndefined(value)){
return get(name);
}
else if(!isUndefined(name)){
}
}
export { cookie };
+220
View File
@@ -0,0 +1,220 @@
import { valType, isUndefined } from './type.js';
/*
* documentReady
* 功能判断页面加载完成
* @fn页面加载完成后执行的函数
*/
function documentReady(fn) {
var isReady = false;
var timer = null;
var doReady = function() {
if(timer) clearInterval(timer);
if(isReady) return;
isReady = true;
if(valType(fn) == 'function') {
fn();
}
};
var bodyLoad = function() {
timer = setInterval(function() {
try {
if(!isUndefined(document.readyState) && document.readyState == 'complete') {
doReady();
}
} catch(event) {};
}, 10);
};
var w3c = function() {
if(valType(fn) == 'function') {
fn();
}
removeListener(window, 'load', w3c);
};
if(!isUndefined(document.body)){
if(valType(fn) == 'function') {
fn();
}
}
else{
try {
addListener(window, 'load', w3c);
} catch(event) {
bodyLoad();
}
}
}
/*
* checkJs
* 功能判断js是否已加载
* @filejs文件路径
*/
function checkJs(file) {
var scriptList = document.scripts;
for (var i = 0; i < scriptList.length; i++) {
if(scriptList[i].src==file){
return scriptList[i];
}
}
return false;
}
/*
* getMaxZIndex
* 功能获取当前页面最大深度
*/
function getMaxZIndex() {
var arr = document.all || document.querySelectorAll('*');
var maxZ = -1;
for (var i = 0; i < arr.length; i++) {
var temp = null;
try {
temp = window.getComputedStyle(arr[i], null).zIndex;
} catch (event) {
if (arr[i].style) {
temp = arr[i].style.zIndex;
}
}
if (temp != 'auto' && parseInt(temp) > maxZ) {
maxZ = parseInt(temp);
}
}
return maxZ;
}
/*
* getWindowSize
* 功能获取window的宽和高
*/
function getWindowSize() {
return {
width: window.innerWidth,
height: window.innerHeight
};
}
/*
* prev
* 功能获取指定节点前一个同胞节点
* @ele要获取的节点
*/
function prev(ele) {
var e = ele.previousSibling;
if (e == null) { //测试同胞节点是否存在,否则返回空
return null;
}
if (e.nodeType == 3) { //如果同胞节点为文本节点
var t = prev(e);
if (t && t.nodeType == 1) {
return t;
}
} else {
if (e.nodeType == 1) { //确认节点为节点节点才返回
return e;
} else {
return false;
}
}
}
/*
* next
* 功能获取指定节点下一个同胞节点
* @ele要获取的节点
*/
function next(ele) {
var e = ele.nextSibling;
if (e == null) { //测试同胞节点是否存在,否则返回空
return null;
}
if (e.nodeType == 3) { //如果同胞节点为文本节点
var t = next(e);
if (t && t.nodeType == 1) {
return t;
}
} else {
if (e.nodeType == 1) { //确认节点为节点才返回
return e;
} else {
return false;
}
}
}
/*
* addListener
* 功能事件监听
* @ele监听对象@e事件名称@f返回事件函数
*/
function addListener(ele, e, f, t) {
if (isUndefined(t)) {
t = false;
}
if (ele.addEventListener) {
try {
ele.addEventListener(e, f, t);
} catch (event) {}
} else if (ele.attachEvent) {
try {
ele.attachEvent('on' + e, f);
} catch (event) {}
} else {
ele['on' + e] = f;
}
if(isUndefined(ele.listenerList)){
ele.listenerList=[];
}
ele.listenerList.push([e,f]);
return ele;
};
/*
* removeListener
* 功能删除事件监听
* @ele监听对象@e事件名称@f返回事件函数
*/
function removeListener(ele, e, f, t) {
if (isUndefined(t)) {
t = false;
}
if (ele.removeEventListener) {
try {
ele.removeEventListener(e, f, t);
} catch (e) {}
} else if (ele.detachEvent) {
try {
ele.detachEvent('on' + e, f);
} catch (e) {}
} else {
ele['on' + e] = null;
}
if(!isUndefined(ele.listenerList)){
var temp=[];
for(var i=0;i<ele.listenerList.length;i++){
if(ele.listenerList[i][0]!=e || ele.listenerList[i][1]!=f){
temp.push(ele.listenerList[i]);
}
}
ele.listenerList=temp;
}
return ele;
}
/*
* documentHidden
* 功能监听页面切换到其它标签执行fn函数
*/
function documentHidden(fn){
if(!isUndefined(document.visibilityState)){
fn(document.visibilityState === 'visible'?'show':'hidden');
addListener(document,'visibilitychange',function(){
fn(document.visibilityState === 'visible'?'show':'hidden');
});
}
}
export { prev, next, addListener, removeListener, getMaxZIndex, getWindowSize, documentReady, documentHidden, checkJs };
+260
View File
@@ -0,0 +1,260 @@
import { isUndefined, valType } from './type.js';
/*
* formatSeconds
* 功能將秒转化成时分秒
*/
function formatSeconds(val) {
if(isUndefined(val)) val=0;
var result = parseInt(val);
if(isUndefined(result)) result=0;
if(result<0) result=0;
var h = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math.floor(result / 3600),
m = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60)),
s = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60)),
res = '';
if(h !== '00') res += h+':';
res += m+':'+s;
return res;
}
/*
* date
* 功能格式化的时间字符串
*/
function date(format, timestamp) {
if(isUndefined(timestamp)){
timestamp=new Date();
}
if(timestamp.toString().length<13) timestamp=timestamp*1000;
var a, jsdate = ((timestamp) ? new Date(timestamp) : new Date());
var pad = function(n, c) {
if((n = n + '').length < c) {
return new Array(++c - n.length).join('0') + n;
} else {
return n;
}
};
var txt_weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var txt_ordin = {
1: 'st',
2: 'nd',
3: 'rd',
21: 'st',
22: 'nd',
23: 'rd',
31: 'st'
};
var txt_months = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var f = {
// Day
d: function() {
return pad(f.j(), 2)
},
D: function() {
return f.l().substr(0, 3)
},
j: function() {
return jsdate.getDate()
},
l: function() {
return txt_weekdays[f.w()]
},
N: function() {
return f.w() + 1
},
S: function() {
return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th'
},
w: function() {
return jsdate.getDay()
},
z: function() {
return(jsdate - new Date(jsdate.getFullYear() + '/1/1')) / 864e5 >> 0
},
// Week
W: function() {
var a = f.z(),
b = 364 + f.L() - a;
var nd2, nd = (new Date(jsdate.getFullYear() + '/1/1').getDay() || 7) - 1;
if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b) {
return 1;
} else {
if(a <= 2 && nd >= 4 && a >= (6 - nd)) {
nd2 = new Date(jsdate.getFullYear() - 1 + '/12/31');
return date('W', Math.round(nd2.getTime() / 1000));
} else {
return(1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
}
}
},
// Month
F: function() {
return txt_months[f.n()]
},
m: function() {
return pad(f.n(), 2)
},
M: function() {
return f.F().substr(0, 3)
},
n: function() {
return jsdate.getMonth() + 1
},
t: function() {
var n;
if((n = jsdate.getMonth() + 1) == 2) {
return 28 + f.L();
} else {
if(n & 1 && n < 8 || !(n & 1) && n > 7) {
return 31;
} else {
return 30;
}
}
},
// Year
L: function() {
var y = f.Y();
return(!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0
},
//o not supported yet
Y: function() {
return jsdate.getFullYear()
},
y: function() {
return(jsdate.getFullYear() + '').slice(2)
},
// Time
a: function() {
return jsdate.getHours() > 11 ? 'pm' : 'am'
},
A: function() {
return f.a().toUpperCase()
},
B: function() {
// peter paul koch:
var off = (jsdate.getTimezoneOffset() + 60) * 60;
var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off;
var beat = Math.floor(theSeconds / 86.4);
if(beat > 1000) beat -= 1000;
if(beat < 0) beat += 1000;
if((String(beat)).length == 1) beat = '00' + beat;
if((String(beat)).length == 2) beat = '0' + beat;
return beat;
},
g: function() {
return jsdate.getHours() % 12 || 12
},
G: function() {
return jsdate.getHours()
},
h: function() {
return pad(f.g(), 2)
},
H: function() {
return pad(jsdate.getHours(), 2)
},
i: function() {
return pad(jsdate.getMinutes(), 2)
},
s: function() {
return pad(jsdate.getSeconds(), 2)
},
//u not supported yet
// Timezone
//e not supported yet
//I not supported yet
O: function() {
var t = pad(Math.abs(jsdate.getTimezoneOffset() / 60 * 100), 4);
if(jsdate.getTimezoneOffset() > 0) t = '-' + t;
else t = '+' + t;
return t;
},
P: function() {
var O = f.O();
return(O.substr(0, 3) + ':' + O.substr(3, 2))
},
//T not supported yet
//Z not supported yet
// Full Date/Time
c: function() {
return f.Y() + '-' + f.m() + '-' + f.d() + 'T' + f.h() + ':' + f.i() + ':' + f.s() + f.P()
},
//r not supported yet
U: function() {
return Math.round(jsdate.getTime() / 1000)
}
};
return format.replace(/([a-zA-Z])/g,function(t, s) {
var ret='';
if(t != s) {
// escaped
ret = s;
} else if(f[s]) {
// a date function exists
ret = f[s]();
} else {
// nothing special
ret = s;
}
return ret;
});
}
/*
* arrayToString
* 功能二维数组传化成字符串
*/
function arrayToString(arr) {
var str='';
if(!isUndefined(arr)){
for(var i=0;i<arr.length;i++){
var temp=arr[i];
if(i>0){
str+=',';
}
for(var y=0;y<temp.length;y++){
if(y>0){
str+=';';
}
if(valType(temp[y])=='number'){
str+=parseInt(temp[y]*100);
}
else{
str+=temp[y];
}
}
}
}
return str;
}
/*
* stringToArray
* 功能字符串转化成二维数组
*/
function stringToArray(str) {
var newArr=[];
if(!isUndefined(str)){
var arr=str.split(',');
for(var i=0;i<arr.length;i++){
var temp=arr[i].split(';');
temp[1]=parseInt(temp[1])*0.01;
temp[2]=parseInt(temp[2])*0.01;
newArr.push(temp);
}
}
return newArr;
}
export { formatSeconds, date, arrayToString, stringToArray };
+186
View File
@@ -0,0 +1,186 @@
import { standardization, isUndefined, valType } from './type.js';
import { addListener } from './dom.js';
/*
* ajax
* 功能ajax功能
* @cObj:传递的参数包含请求地址请求类型编码等
*/
function ajax(cObj) {
var callback = null;
var obj = {
method: 'get',//请求类型
dataType: 'json',//请求的数据类型
charset: 'utf-8',
async: true,//true表示异步,false表示同步
url: '',
data: null,
success: null,
error:null
};
obj = standardization(obj, cObj);
if (isUndefined(obj['url'])) {
return;
}
/*
* errorFun
*功能执行error
*/
var errorFun=function(info){
if(!isUndefined(obj['error']) && valType(obj['error'])=='function'){
obj['error'](info);
}
else{
obj['success'](null);
}
};
/*
* successFun
*功能执行success
*/
var successFun=function(success){
if(!isUndefined(obj['success']) && valType(obj['success'])=='function'){
obj['success'](success);
}
};
/*
* createXHR
*功能用来为ajax函数提供支持
*/
var createXHR=function() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
return new ActiveXObject('Microsoft.XMLHTTP');
} catch(event) {
try {
return new ActiveXObject('Msxml2.XMLHTTP');
} catch(event) {}
}
}
};
/*
* formatParams
* 功能将对象转成地址字符串为ajax函数提供支持
* @obj传递一个对象
*/
var formatParams=function(obj) {
var arr = [];
for (var key in obj) {
arr.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
}
return arr.join('&');
};
if (valType(cObj) != 'object') {
if(!isUndefined(obj['error'])){
obj.error(event);
}
return;
}
if (obj.dataType === 'json' || obj.dataType === 'text' || obj.dataType === 'html' || obj.dataType === 'xml') {
var xhr = createXHR();
callback = function() {
//判断http的交互是否成功
if (xhr.status === 200) {
if (obj.dataType === 'json') {
try {
successFun(eval('(' + xhr.responseText + ')')); //回调传递参数
}
catch(event) {
successFun(null);
}
} else {
successFun(xhr.responseText); //回调传递参数
}
}
else {
errorFun({code:xhr.status,message:xhr.statusText});
}
};
obj.data = formatParams(obj.data); //通过params()将名值对转换成字符串
if (obj.method === 'get' && !isUndefined(obj.data)) {
if (obj.data != '') {
if (obj.url.indexOf('?') == -1) {
obj.url += '?' + obj.data
} else {
obj.url += '&' + obj.data;
}
}
}
if (obj.async === true) { //true表示异步,false表示同步
addListener(xhr,'readystatechange',function(event){
if (this.readyState === 4 && callback != null) { //判断对象的状态是否交互完成
callback(); //回调
}
});
}
xhr.open(obj.method, obj.url, obj.async);
if (obj.method === 'post') {
try{
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('charset', obj['charset']);
xhr.send(obj.data);
}
catch(event){
callback();
}
}
else {
try{
xhr.send(null); //get方式则填null
}
catch(event){
callback();
}
}
if (obj.async === false) { //同步
callback();
}
}
else if (obj.dataType === 'jsonp') {
var oHead = document.getElementsByTagName('head')[0];
var oScript = document.createElement('script');
var callbackName = 'callback' + new Date().getTime();
var params = formatParams(obj.data) + '&callback=' + callbackName; //按时间戳拼接字符串
//拼接好src
oScript.src = obj.url.split('?') + '?' + params;
//插入script标签
oHead.insertBefore(oScript, oHead.firstChild);
//jsonp的回调函数
window[callbackName] = function(json) {
if(!isUndefined(obj['success']) && valType(obj['success'])==='function'){
obj['success'](json);
}
oHead.removeChild(oScript);
};
}
}
/*
* dataURLtoBlob
* 功能base64转blob
*/
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
}
/*
* getApp
* 功能获取平台类型是否是iphone
*/
function getApp(){
var u = navigator.userAgent.toLowerCase();
if(u.indexOf('iphone')>-1){
return 'iphone';
}
}
export { ajax, dataURLtoBlob, getApp };
+26
View File
@@ -0,0 +1,26 @@
import { isUndefined } from './type.js';
/*
* getPath
* 功能获取该js文件所在路径
*/
function getPath(siz) {
var scriptList = document.scripts,
thisPath = scriptList[scriptList.length - 1].src;
for (var i = 0; i < scriptList.length; i++) {
var scriptName = scriptList[i].getAttribute('name') || scriptList[i].getAttribute('data-name');
var src = scriptList[i].src.slice(scriptList[i].src.lastIndexOf('/') + 1, scriptList[i].src.lastIndexOf('.'));
if ((scriptName && (scriptName == 'moeplayer' || scriptName == 'moeplayer.min')) || (scriptList[i].src && (src == 'moeplayer' || src == 'moeplayer.min'))) {
thisPath = scriptList[i].src;
break;
}
}
var path=thisPath.substring(0, thisPath.lastIndexOf('/js/') + 1);
if(!isUndefined(siz)){
path+=siz+'/';
}
return path;
}
export { getPath };
+99
View File
@@ -0,0 +1,99 @@
/*
* standardization
* 功能将对象Object标准化将n对象替换进o对象
* @o:标准化对象@n外部传递对象
*/
function standardization(o, n) { //n替换进o
var h = {};
var k;
for (k in o) {
h[k] = o[k];
}
for (k in n) {
if(k in h){
h[k] = n[k];
}
}
return h;
}
/*
* mergeObj
* 功能将新对象合并到原对象中需要确保原对像里有对应的值并且类型一样
* @o:原对象@n新对象
*/
function mergeObj(o,n){
var h = {};
var k;
for (k in o) {
h[k] = o[k];
}
for (k in n) {
if(k in h){
switch(valType(h[k])){
case 'object':
if(valType(n[k])=='object'){
h[k] = mergeObj(h[k],n[k]);
}
break;
default:
if(valType(h[k])==valType(n[k])){
h[k] = n[k];
}
break;
}
}
}
return h;
}
/*
* valType
* 功能判断变量类型
*/
function valType(val) {
if(typeof val==='undefined') return 'undefined';
var str=Object.prototype.toString.call(val).split(' ')[1].replace(']','').toLowerCase();
if(str.substr(0,4)=='html' && (str.substr(-7)=='element' || str.substr(-8)=='document' || str=='window')){
str='htmlobject';
}
if(str=='htmlcollection' || str=='nodelist'){
str='htmlarray';
}
return str;
}
/*
* isUndefined
* 功能判断变量是否存在或值是否为undefined
*/
function isUndefined(val) {
try {
return valType(val)==='undefined' || val === undefined || val === null || (valType(val)==='number' && isNaN(val));
} catch (event) {
return true;
}
return false;
}
/*
* decodeURIString
* 功能解码中文
*/
function decodeURIString(obj){
for(var k in obj){
if(valType(obj[k])=='string' && obj[k]){
try{
obj[k]=decodeURI(obj[k]);
}
catch(event){}
}
if(valType(obj[k])=='object'){
obj[k]=decodeURIString(obj[k]);
}
}
return obj;
}
export { standardization, mergeObj, valType, isUndefined, decodeURIString };