阶段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:
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
Vendored
+7
-1
File diff suppressed because one or more lines are too long
Generated
+501
-1
@@ -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
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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: /^!|软件名称|版权/
|
||||
}
|
||||
})
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
@@ -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
@@ -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 };
|
||||
@@ -0,0 +1,9 @@
|
||||
/*
|
||||
* 软件名称:MoePlayer
|
||||
* 版本:X3
|
||||
* 版权:MoePlayer 项目(fork 自 ckplayer, www.ckplayer.com)
|
||||
* 开源协议:MIT
|
||||
*/
|
||||
import moeplayerEmbed from './core/moeplayerEmbed.js';
|
||||
|
||||
export default moeplayerEmbed;
|
||||
@@ -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 };
|
||||
@@ -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 };
|
||||
@@ -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是否已加载
|
||||
* @file:js文件路径
|
||||
*/
|
||||
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 };
|
||||
@@ -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 };
|
||||
@@ -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 };
|
||||
@@ -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 };
|
||||
@@ -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 };
|
||||
Reference in New Issue
Block a user