ckplayer-plus 1.0.2 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ckplayer-plus
2
2
 
3
- 基于 [ckplayer](https://www.ckplayer.com) X3 的工程化封装:支持 **npm / ESM**,并提供 **Vue 2/3** 与 **React** 组件。
3
+ 基于 [ckplayer](https://www.ckplayer.com) X3 的工程化封装:支持 **npm / ESM**,并提供 **Vue 2.7+/3** 与 **React** 组件。
4
4
 
5
5
  > **免责声明**:本包为社区/工程化封装,**非 ckplayer 官方包**。播放内核来自 ckplayer(MIT)。完整能力与参数请同时参考 [官方手册](https://www.ckplayer.com/manual/)。npm 上的官方包名为 [`ckplayer`](https://www.npmjs.com/package/ckplayer),请勿混淆。
6
6
 
@@ -74,30 +74,37 @@ React:
74
74
  |------|------|------|
75
75
  | `autoPlug` | `true` | 按地址自动选插件;通常保持默认即可 |
76
76
  | `plug` | 自动 | 仅在要强制指定或 `autoPlug: false` 时填写:`hls.js` / `flv.js` / `mpegts.js` |
77
+ | `preferBuiltinPlug` | `true` | 优先加载本包内置脚本,避免复用页面上其它全局 `Hls` |
78
+ | `cdnFallback` | `true` | `getPath` 失败时回退 jsDelivr;内网无外网请设 `false` 并配 `pluginPath` |
77
79
  | `pluginPath` | 自动 | 插件脚本根路径。默认:`window.ckplayerBasePath` → 本包 `dist/` → jsDelivr CDN |
80
+ | `seek` | `0` | 续播秒数(number 或数字字符串);会同步 `maxSeeTime`,兼容 `timeScheduleAdjust: 5` |
78
81
  | `loaded` | — | **只支持函数**;字符串形式已禁用(防 XSS) |
79
82
 
80
83
  ### 进阶(按需)
81
84
 
82
85
  | 配置 | 说明 |
83
86
  |------|------|
87
+ | `timeScheduleAdjust` | `5` 时只能在已看进度内拖动;续播请同时传数字 `seek` |
84
88
  | `crossOrigin` | 跨域视频 / 截图等场景 |
85
89
  | `cookie` | 进度记忆;组件默认使用实例唯一名,避免多实例冲突 |
86
90
  | `language` | 语言包名,如 `en`、`zh.hk`(需能加载到 `language/*.js`) |
87
- | `seek` / `loop` / `controls` 等 | 与官方 ckplayer 一致,见[手册](https://www.ckplayer.com/manual/) |
91
+ | `loop` / `controls` 等 | 与官方 ckplayer 一致,见[手册](https://www.ckplayer.com/manual/) |
88
92
  | `window.ckplayerBasePath` | 全局指定插件根目录(以 `/` 结尾),优先于 CDN |
89
93
  | `window.ckplayerPlusCdn` | 自定义 CDN 根地址(覆盖默认 jsDelivr) |
90
94
 
91
95
  ### 插件加载优先级
92
96
 
93
- 1. 页面上已有全局 `Hls` / `flvjs` / `mpegts` → 直接用,不再请求脚本
94
- 2. `pluginPath` `window.ckplayerBasePath`
97
+ 1. `preferBuiltinPlug: false` 且页面已有全局 `Hls` / `flvjs` / `mpegts` → 直接复用
98
+ 2. 否则加载本包脚本:`pluginPath` 或可信的 `window.ckplayerBasePath`(仅 dist / npm 包路径会自动设置;Vite/Webpack chunk 目录会忽略)
95
99
  3. 传统 `<script src=".../ckplayer.min.js">` 同级目录推导
96
- 4. 回退:`https://cdn.jsdelivr.net/npm/ckplayer-plus@x.y.z/dist/`(发布到 npm 后可用)
100
+ 4. `cdnFallback !== false` 时回退:`https://cdn.jsdelivr.net/npm/ckplayer-plus@x.y.z/dist/`;若本地路径 404 会再自动重试一次 CDN
97
101
 
98
- > 内网离线:把 `node_modules/ckplayer-plus/dist/` 里的 `hls.js/` 等目录放到可访问静态路径,并设置 `pluginPath` 或 `window.ckplayerBasePath`。
102
+ > 内网离线:把 `node_modules/ckplayer-plus/dist/` 里的 `hls.js/` 等目录放到可访问静态路径,并设置 `pluginPath` 或 `window.ckplayerBasePath`,建议同时 `cdnFallback: false`。
103
+ > 样式请使用 `import 'ckplayer-plus/style.css'`,保证 `./images/` 图标能被打包工具解析。
99
104
 
100
- ## Vue 2 / Vue 3
105
+ ## Vue 2.7 / Vue 3
106
+
107
+ 支持 **Vue 2.7+** 与 **Vue 3**(需从 `vue` 解析 `h`,与 peerDependencies 一致)。
101
108
 
102
109
  ```vue
103
110
  <template>
@@ -165,9 +172,3 @@ npm publish --access public
165
172
  ## License
166
173
 
167
174
  MIT。内置的 hls.js / flv.js / mpegts.js 遵循各自许可证(多为 Apache-2.0)。
168
-
169
- ## 相关链接
170
-
171
- - 官网:https://www.ckplayer.com
172
- - 手册:https://www.ckplayer.com/manual/
173
- - 官方 npm:https://www.npmjs.com/package/ckplayer
package/dist/ckplayer.js CHANGED
@@ -141,7 +141,7 @@
141
141
  cdnFallback:true// getPath 失败时是否回退到 jsDelivr(内网可设 false,并配置 pluginPath)
142
142
  };
143
143
  // 打包时替换为真实版本;用于 bundler 下 getPath 失效时的 CDN 回退
144
- var ckplayerPlusDefaultCdn='https://cdn.jsdelivr.net/npm/ckplayer-plus@1.0.2/dist/';
144
+ var ckplayerPlusDefaultCdn='https://cdn.jsdelivr.net/npm/ckplayer-plus@1.0.5/dist/';
145
145
  function ckplayerEmbed(videoObj){
146
146
  /*
147
147
  * rightMenu
@@ -371,6 +371,16 @@
371
371
  return embed(obj);
372
372
  }
373
373
  },
374
+ /*
375
+ * isUnreliablePluginBase
376
+ * 功能:识别 bundler chunk 目录(不含 hls.js 等插件),避免短路 CDN 回退
377
+ */
378
+ isUnreliablePluginBase=function(base){
379
+ if(!base || valType(base)!='string'){
380
+ return true;
381
+ }
382
+ return /\/(?:assets|\.vite\/deps|_next\/static|chunks?)\/?$/i.test(base);
383
+ },
374
384
  /*
375
385
  * resolveAssetPath
376
386
  * 功能:解析插件/语言包路径
@@ -384,6 +394,9 @@
384
394
  else if(typeof window!=='undefined' && window.ckplayerBasePath){
385
395
  base=window.ckplayerBasePath;
386
396
  }
397
+ if(base && isUnreliablePluginBase(base)){
398
+ base='';
399
+ }
387
400
  if(base){
388
401
  if(base.slice(-1)!=='/'){
389
402
  base+='/';
@@ -391,12 +404,12 @@
391
404
  return base+folder+'/'+file;
392
405
  }
393
406
  var fromScript=getPath(folder)+file;
394
- if(fromScript && fromScript.indexOf(folder+'/')>-1 && fromScript.indexOf('undefined')===-1){
407
+ if(fromScript && fromScript.indexOf(folder+'/')>-1 && fromScript.indexOf('undefined')===-1 && !isUnreliablePluginBase(getPath())){
395
408
  return fromScript;
396
409
  }
397
410
  var allowCdn=!vars || vars['cdnFallback']!==false;
398
411
  var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
399
- if(!allowCdn || !cdn || cdn.indexOf('1.0.2')>-1){
412
+ if(!allowCdn || !cdn || cdn.indexOf('1.0.5')>-1){
400
413
  // 避免占位版本或显式关闭 CDN 时请求坏地址;交给相对路径或业务 pluginPath
401
414
  return folder+'/'+file;
402
415
  }
@@ -6693,7 +6706,7 @@
6693
6706
  * @file:js文件地址
6694
6707
  * @callback:加载完成后执行的函数
6695
6708
  */
6696
- loadJs=function(file, callback) {
6709
+ loadJs=function(file, callback, isRetry) {
6697
6710
  var fn =function() {};
6698
6711
  if(!isUndefined(callback)){
6699
6712
  fn=callback;
@@ -6725,19 +6738,38 @@
6725
6738
  } catch(event) {};
6726
6739
  }, 10);
6727
6740
  };
6741
+ var removeScript = function() {
6742
+ try {
6743
+ if(script.parentNode){
6744
+ script.parentNode.removeChild(script);
6745
+ }
6746
+ } catch(event) {}
6747
+ };
6728
6748
  var w3c = function() {
6729
- if(valType(fn) == 'function') {
6730
- fn();
6731
- }
6732
6749
  removeListener(script, 'load', w3c);
6733
6750
  removeListener(script, 'error', w3cError);
6751
+ doReady();
6734
6752
  };
6735
6753
  var w3cError = function() {
6736
- if(valType(fn) == 'function') {
6737
- fn();
6738
- }
6739
6754
  removeListener(script, 'load', w3c);
6740
6755
  removeListener(script, 'error', w3cError);
6756
+ removeScript();
6757
+ // bundler 下错误 base 路径 404 时,回退 jsDelivr 再试一次
6758
+ if(!isRetry && (!vars || vars['cdnFallback']!==false)){
6759
+ var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
6760
+ var m=String(file).match(/\/(hls\.js|flv\.js|mpegts\.js|language)\/([^/?#]+)(?:[?#].*)?$/i);
6761
+ if(cdn && cdn.indexOf('1.0.5')===-1 && m){
6762
+ if(cdn.slice(-1)!=='/'){
6763
+ cdn+='/';
6764
+ }
6765
+ var retryUrl=cdn+m[1]+'/'+m[2];
6766
+ if(retryUrl!==file){
6767
+ loadJs(retryUrl, callback, true);
6768
+ return;
6769
+ }
6770
+ }
6771
+ }
6772
+ // 加载失败不再假装成功,避免在 Hls/flvjs 未定义时继续执行
6741
6773
  };
6742
6774
  try {
6743
6775
  addListener(script, 'load', w3c);
@@ -7021,13 +7053,19 @@
7021
7053
  function getPath(siz) {
7022
7054
  if (typeof window !== 'undefined' && window.ckplayerBasePath) {
7023
7055
  var base = window.ckplayerBasePath;
7024
- if (base.slice(-1) !== '/') {
7025
- base += '/';
7056
+ // bundler chunk 目录不含插件文件,忽略并继续 script/CDN 推导
7057
+ if (/\/(?:assets|\.vite\/deps|_next\/static|chunks?)\/?$/i.test(base)) {
7058
+ base = '';
7026
7059
  }
7027
- if (!isUndefined(siz)) {
7028
- return base + siz + '/';
7060
+ if (base) {
7061
+ if (base.slice(-1) !== '/') {
7062
+ base += '/';
7063
+ }
7064
+ if (!isUndefined(siz)) {
7065
+ return base + siz + '/';
7066
+ }
7067
+ return base;
7029
7068
  }
7030
- return base;
7031
7069
  }
7032
7070
  var scriptList = document.scripts || [],
7033
7071
  thisPath = scriptList.length ? scriptList[scriptList.length - 1].src : '';