diff --git a/CHANGELOG_CN.md b/CHANGELOG_CN.md
index 971eb74ff..e8128160a 100644
--- a/CHANGELOG_CN.md
+++ b/CHANGELOG_CN.md
@@ -7,7 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
## [Unreleased]
- 新增 `option.proxy` 选项,用于代理第三方的 `video` 和 `canvas`
-- 新增 `artplayer-proxy-canvas` 代理
+- 新增 `artplayer-proxy-canvas` 代理,可以使用 `canvas` 播放视频
- 新增 `artplayer-proxy-webav` 代理,来自 [bilibili/WebAV](https://github.com/bilibili/WebAV)
- 新增 `option.thumbnails.scale`, 用于预览图缩放
- 修复更改 `art.url` 不能触发 `autoPlayBack` 的 `bug`: [#797](https://github.com/zhw2590582/ArtPlayer/issues/797)
@@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- 修改 `subtitleUpdate` 事件为 `subtitleAfterUpdate`, 在字幕元素渲染后触发
- 优化 `subtitleLoad` 事件的触发时机和回调参数
- 删除 `subtitleSwitch` 事件,请使用 `subtitleLoad` 代替
+- 升级 `artplayer-plugin-hls-quality` 为 `artplayer-plugin-hls-control`
## [5.1.7] - 2024-8-15
diff --git a/README.md b/README.md
index d3084fdd5..88951203a 100644
--- a/README.md
+++ b/README.md
@@ -98,7 +98,7 @@ var art = new Artplayer({
- [artplayer-plugin-danmuku](https://artplayer.org/?libs=./uncompiled/artplayer-plugin-danmuku/index.js&example=danmuku)
- [artplayer-plugin-ads](https://artplayer.org/?libs=./uncompiled/artplayer-plugin-ads/index.js&example=ads) (WIP)
- [artplayer-plugin-iframe](https://artplayer.org/?libs=./uncompiled/artplayer-plugin-iframe/index.js&example=iframe)
-- [artplayer-plugin-hls-quality](https://artplayer.org/?libs=https://cdnjs.cloudflare.com/ajax/libs/hls.js/8.0.0-beta.3/hls.min.js%0A./uncompiled/artplayer-plugin-hls-quality/index.js&example=hls.quality)
+- [artplayer-plugin-hls-control](https://artplayer.org/?libs=https://cdnjs.cloudflare.com/ajax/libs/hls.js/8.0.0-beta.3/hls.min.js%0A./uncompiled/artplayer-plugin-hls-control/index.js&example=hls.control)
- [artplayer-plugin-dash-quality](https://artplayer.org/?libs=https://cdnjs.cloudflare.com/ajax/libs/dashjs/4.5.2/dash.all.min.js%0A./uncompiled/artplayer-plugin-dash-quality/index.js&example=dash.quality)
- [artplayer-plugin-vtt-thumbnail](https://artplayer.org/?libs=./uncompiled/artplayer-plugin-vtt-thumbnail/index.js&example=vtt.thumbnail)
- [artplayer-plugin-multiple-subtitles](https://artplayer.org/?libs=./uncompiled/artplayer-plugin-multiple-subtitles/index.js&example=multiple.subtitles)
diff --git a/docs/assets/example/hls.control.js b/docs/assets/example/hls.control.js
new file mode 100644
index 000000000..c04d5b631
--- /dev/null
+++ b/docs/assets/example/hls.control.js
@@ -0,0 +1,53 @@
+// npm i hls.js
+// npm i artplayer-plugin-hls-control
+
+// import Hls from 'hls.js';
+// import artplayerPluginHlsControl from 'artplayer-plugin-hls-control';
+
+var art = new Artplayer({
+ container: '.artplayer-app',
+ url: 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8',
+ setting: true,
+ plugins: [
+ artplayerPluginHlsControl({
+ quality: {
+ // Show qualitys in control
+ control: true,
+ // Show qualitys in setting
+ setting: true,
+ // Get the quality name from level
+ getName: (level) => level.height + 'P',
+ // I18n
+ title: 'Quality',
+ auto: 'Auto',
+ },
+ audio: {
+ // Show audios in control
+ control: true,
+ // Show audios in setting
+ setting: true,
+ // Get the audio name from track
+ getName: (track) => track.name,
+ // I18n
+ title: 'Audio',
+ auto: 'Auto',
+ }
+ }),
+ ],
+ customType: {
+ m3u8: function playM3u8(video, url, art) {
+ if (Hls.isSupported()) {
+ if (art.hls) art.hls.destroy();
+ const hls = new Hls();
+ hls.loadSource(url);
+ hls.attachMedia(video);
+ art.hls = hls;
+ art.on('destroy', () => hls.destroy());
+ } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
+ video.src = url;
+ } else {
+ art.notice.show = 'Unsupported playback format: m3u8';
+ }
+ }
+ },
+});
diff --git a/docs/assets/example/hls.quality.js b/docs/assets/example/hls.quality.js
deleted file mode 100644
index f6709e3e4..000000000
--- a/docs/assets/example/hls.quality.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// npm i hls.js
-// npm i artplayer-plugin-hls-quality
-
-// import Hls from 'hls.js';
-// import artplayerPluginHlsQuality from 'artplayer-plugin-hls-quality';
-
-var art = new Artplayer({
- container: '.artplayer-app',
- url: 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8',
- setting: true,
- plugins: [
- artplayerPluginHlsQuality({
- // Show quality in control
- control: true,
-
- // Show quality in setting
- setting: true,
-
- // Get the resolution text from level
- getResolution: (level) => level.height + 'P',
-
- // I18n
- title: 'Quality',
- auto: 'Auto',
- }),
- ],
- customType: {
- m3u8: function playM3u8(video, url, art) {
- if (Hls.isSupported()) {
- if (art.hls) art.hls.destroy();
- const hls = new Hls();
- hls.loadSource(url);
- hls.attachMedia(video);
- art.hls = hls;
- art.on('destroy', () => hls.destroy());
- } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
- video.src = url;
- } else {
- art.notice.show = 'Unsupported playback format: m3u8';
- }
- }
- },
-});
diff --git a/docs/index.html b/docs/index.html
index d99321ad3..645e28f58 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -65,7 +65,7 @@
artplayer-plugin-hls-quality
+ href="/?libs=https://cdnjs.cloudflare.com/ajax/libs/hls.js/8.0.0-beta.3/hls.min.js%0A./uncompiled/artplayer-plugin-hls-control/index.js&example=hls.control">artplayer-plugin-hls-control
",
"browserslist": "last 1 Chrome version",
"homepage": "https://artplayer.org",
diff --git a/packages/artplayer-plugin-hls-quality/src/index.js b/packages/artplayer-plugin-hls-control/src/index.js
similarity index 73%
rename from packages/artplayer-plugin-hls-quality/src/index.js
rename to packages/artplayer-plugin-hls-control/src/index.js
index f85e66917..3f9f2d0d3 100644
--- a/packages/artplayer-plugin-hls-quality/src/index.js
+++ b/packages/artplayer-plugin-hls-control/src/index.js
@@ -1,24 +1,24 @@
import $quality from 'bundle-text:./quality.svg';
-export default function artplayerPluginHlsQuality(option) {
+export default function artplayerPluginHlsControl(option = {}) {
return (art) => {
const { $video } = art.template;
const { errorHandle } = art.constructor.utils;
function updateQuality(hls) {
- const auto = option.auto || 'Auto';
- const title = option.title || 'Quality';
-
- const getResolution = option.getResolution || ((level) => (level.height || 'Unknown ') + 'P');
+ const config = option.quality || {};
+ const auto = config.auto || 'Auto';
+ const title = config.title || 'Quality';
+ const getName = config.getName || ((level) => (level.height || 'Unknown ') + 'P');
const defaultLevel = hls.levels[hls.currentLevel];
- const defaultHtml = defaultLevel ? getResolution(defaultLevel) : auto;
+ const defaultHtml = defaultLevel ? getName(defaultLevel) : auto;
const selector = hls.levels
.map((item, index) => {
return {
- html: getResolution(item),
+ html: getName(item, index),
level: item.level || index,
- default: defaultLevel === item,
+ default: hls.currentLevel === index,
};
})
.sort((a, b) => b.level - a.level);
@@ -26,7 +26,7 @@ export default function artplayerPluginHlsQuality(option) {
selector.push({
html: auto,
level: -1,
- default: defaultLevel === -1,
+ default: hls.currentLevel === -1,
});
const onSelect = (item) => {
@@ -36,7 +36,7 @@ export default function artplayerPluginHlsQuality(option) {
return item.html;
};
- if (option.control) {
+ if (config.control) {
art.controls.update({
name: 'hls-quality',
position: 'right',
@@ -47,7 +47,7 @@ export default function artplayerPluginHlsQuality(option) {
});
}
- if (option.setting) {
+ if (config.setting) {
art.setting.update({
name: 'hls-quality',
tooltip: defaultHtml,
@@ -75,12 +75,12 @@ export default function artplayerPluginHlsQuality(option) {
art.on('restart', update);
return {
- name: 'artplayerPluginHlsQuality',
+ name: 'artplayerPluginHlsControl',
update,
};
};
}
if (typeof window !== 'undefined') {
- window['artplayerPluginHlsQuality'] = artplayerPluginHlsQuality;
+ window['artplayerPluginHlsControl'] = artplayerPluginHlsControl;
}
diff --git a/packages/artplayer-plugin-hls-quality/src/quality.svg b/packages/artplayer-plugin-hls-control/src/quality.svg
similarity index 100%
rename from packages/artplayer-plugin-hls-quality/src/quality.svg
rename to packages/artplayer-plugin-hls-control/src/quality.svg
diff --git a/packages/artplayer-plugin-hls-control/types/artplayer-plugin-hls-control.d.ts b/packages/artplayer-plugin-hls-control/types/artplayer-plugin-hls-control.d.ts
new file mode 100644
index 000000000..8bf8f1054
--- /dev/null
+++ b/packages/artplayer-plugin-hls-control/types/artplayer-plugin-hls-control.d.ts
@@ -0,0 +1,24 @@
+import type Artplayer from 'artplayer';
+
+export = artplayerPluginHlsControl;
+export as namespace artplayerPluginHlsControl;
+
+declare const artplayerPluginHlsControl: (option: {
+ quality?: {
+ control?: boolean;
+ setting?: boolean;
+ title?: string;
+ auto?: string;
+ getName?(level: object): String;
+ };
+ audio?: {
+ control?: boolean;
+ setting?: boolean;
+ title?: string;
+ auto?: string;
+ getName?(level: object): String;
+ };
+}) => (art: Artplayer) => {
+ name: 'artplayerPluginHlsControl';
+ update: () => void;
+};
diff --git a/packages/artplayer-plugin-hls-quality/dist/artplayer-plugin-hls-quality.js b/packages/artplayer-plugin-hls-quality/dist/artplayer-plugin-hls-quality.js
deleted file mode 100644
index 7c7e0d9c7..000000000
--- a/packages/artplayer-plugin-hls-quality/dist/artplayer-plugin-hls-quality.js
+++ /dev/null
@@ -1 +0,0 @@
-/*! * artplayer-plugin-hls-quality.js v2.0.0 * Github:https://github.com/zhw2590582/ArtPlayer * (c) 2017-2024 Harvey Zack * Released under the MIT License. */ !function(e,t,n,o,l){var r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},i="function"==typeof r[o]&&r[o],u=i.cache||{},a="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function f(t,n){if(!u[t]){if(!e[t]){var l="function"==typeof r[o]&&r[o];if(!n&&l)return l(t,!0);if(i)return i(t,!0);if(a&&"string"==typeof t)return a(t);var s=Error("Cannot find module '"+t+"'");throw s.code="MODULE_NOT_FOUND",s}d.resolve=function(n){var o=e[t][1][n];return null!=o?o:n},d.cache={};var c=u[t]=new f.Module(t);e[t][0].call(c.exports,d,c,c.exports,this)}return u[t].exports;function d(e){var t=d.resolve(e);return!1===t?{}:f(t)}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=u,f.parent=i,f.register=function(t,n){e[t]=[function(e,t){t.exports=n},{}]},Object.defineProperty(f,"root",{get:function(){return r[o]}}),r[o]=f;for(var s=0;si);var l=e("bundle-text:./image.svg"),r=o.interopDefault(l);function i(e){return t=>{!function(e){let{version:t,utils:{errorHandle:n}}=e.constructor,o=t.split(".").map(Number);n(o[0]+o[1]/100>=5,`Artplayer.js@${t}is not compatible the artplayerPluginHlsQuality@${i.version}. Please update it to version Artplayer.js@5.x.x`)}(t);let{$video:n}=t.template,{errorHandle:o}=t.constructor.utils;function l(){let l=t.hls||window.hls;o(l&&l.media===n,'Cannot find instance of HLS from "art.hls" or "window.hls"');let i=e.auto||"Auto",u=e.title||"Quality",a=e.getResolution||(e=>(e.height||"Unknown ")+"P"),f=l.levels[l.currentLevel],s=f?a(f):i;e.control&&t.controls.update({name:"hls-quality",position:"right",html:s,style:{padding:"0 10px"},selector:l.levels.map((e,t)=>({html:a(e),level:e.level||t,default:f===e})),onSelect:e=>(l.currentLevel=e.level,t.loading.show=!0,e.html)}),e.setting&&t.setting.update({name:"hls-quality",tooltip:s,html:u,icon:r.default,width:200,selector:l.levels.map((e,t)=>({html:a(e),level:e.level||t,default:f===e})),onSelect:function(e){return l.currentLevel=e.level,t.loading.show=!0,e.html}})}return t.on("ready",l),t.on("restart",l),{name:"artplayerPluginHlsQuality"}}}"undefined"!=typeof window&&(window.artplayerPluginHlsQuality=i)},{"bundle-text:./image.svg":"5VXix","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"5VXix":[function(e,t,n){t.exports=''},{}],"9pCYc":[function(e,t,n){n.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},n.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},n.exportAll=function(e,t){return Object.keys(e).forEach(function(n){"default"===n||"__esModule"===n||Object.prototype.hasOwnProperty.call(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:function(){return e[n]}})}),t},n.export=function(e,t,n){Object.defineProperty(e,t,{enumerable:!0,get:n})}},{}]},["eEHR6"],"eEHR6","parcelRequire4dc0");
\ No newline at end of file
diff --git a/packages/artplayer-plugin-hls-quality/dist/artplayer-plugin-hls-quality.legacy.js b/packages/artplayer-plugin-hls-quality/dist/artplayer-plugin-hls-quality.legacy.js
deleted file mode 100644
index ef7cb7d72..000000000
--- a/packages/artplayer-plugin-hls-quality/dist/artplayer-plugin-hls-quality.legacy.js
+++ /dev/null
@@ -1 +0,0 @@
-/*! * artplayer-plugin-hls-quality.js v2.0.0 * Github:https://github.com/zhw2590582/ArtPlayer * (c) 2017-2024 Harvey Zack * Released under the MIT License. */ !function(e,t,n,r,o){var l="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},i="function"==typeof l[r]&&l[r],u=i.cache||{},a="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function f(t,n){if(!u[t]){if(!e[t]){var o="function"==typeof l[r]&&l[r];if(!n&&o)return o(t,!0);if(i)return i(t,!0);if(a&&"string"==typeof t)return a(t);var s=Error("Cannot find module '"+t+"'");throw s.code="MODULE_NOT_FOUND",s}d.resolve=function(n){var r=e[t][1][n];return null!=r?r:n},d.cache={};var c=u[t]=new f.Module(t);e[t][0].call(c.exports,d,c,c.exports,this)}return u[t].exports;function d(e){var t=d.resolve(e);return!1===t?{}:f(t)}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=u,f.parent=i,f.register=function(t,n){e[t]=[function(e,t){t.exports=n},{}]},Object.defineProperty(f,"root",{get:function(){return l[r]}}),l[r]=f;for(var s=0;s=5,"Artplayer.js@".concat(r," is not compatible the artplayerPluginHlsQuality@").concat(i.version,". Please update it to version Artplayer.js@5.x.x"));var n,r,o,u=t.template.$video,a=t.constructor.utils.errorHandle;function f(){var n=t.hls||window.hls;a(n&&n.media===u,'Cannot find instance of HLS from "art.hls" or "window.hls"');var r=e.auto||"Auto",o=e.title||"Quality",i=e.getResolution||function(e){return(e.height||"Unknown ")+"P"},f=n.levels[n.currentLevel],s=f?i(f):r;e.control&&t.controls.update({name:"hls-quality",position:"right",html:s,style:{padding:"0 10px"},selector:n.levels.map(function(e,t){return{html:i(e),level:e.level||t,default:f===e}}),onSelect:function(e){return n.currentLevel=e.level,t.loading.show=!0,e.html}}),e.setting&&t.setting.update({name:"hls-quality",tooltip:s,html:o,icon:l.default,width:200,selector:n.levels.map(function(e,t){return{html:i(e),level:e.level||t,default:f===e}}),onSelect:function(e){return n.currentLevel=e.level,t.loading.show=!0,e.html}})}return t.on("ready",f),t.on("restart",f),{name:"artplayerPluginHlsQuality"}}}"undefined"!=typeof window&&(window.artplayerPluginHlsQuality=i)},{"bundle-text:./image.svg":"jPEUe","@parcel/transformer-js/src/esmodule-helpers.js":"iWrD0"}],jPEUe:[function(e,t,n){t.exports=''},{}],iWrD0:[function(e,t,n){n.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},n.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},n.exportAll=function(e,t){return Object.keys(e).forEach(function(n){"default"===n||"__esModule"===n||Object.prototype.hasOwnProperty.call(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:function(){return e[n]}})}),t},n.export=function(e,t,n){Object.defineProperty(e,t,{enumerable:!0,get:n})}},{}]},["34JKw"],"34JKw","parcelRequire4dc0");
\ No newline at end of file
diff --git a/packages/artplayer-plugin-hls-quality/types/artplayer-plugin-hls-quality.d.ts b/packages/artplayer-plugin-hls-quality/types/artplayer-plugin-hls-quality.d.ts
deleted file mode 100644
index 9b7c66f9b..000000000
--- a/packages/artplayer-plugin-hls-quality/types/artplayer-plugin-hls-quality.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import type Artplayer from 'artplayer';
-
-export = artplayerPluginHlsQuality;
-export as namespace artplayerPluginHlsQuality;
-
-declare const artplayerPluginHlsQuality: (option: {
- control?: boolean;
- setting?: boolean;
- title?: string;
- auto?: string;
- getResolution?(level: any): String;
-}) => (art: Artplayer) => {
- name: 'artplayerPluginHlsQuality';
-};