@oplayer/hls
Version:
Hls plugin for oplayer
9 lines (8 loc) • 4.85 kB
JavaScript
/**
* name: @oplayer/hls
* version: v1.2.28-beta.1
* description: Hls plugin for oplayer
* author: shiyiya
* homepage: https://github.com/shiyiya/oplayer
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@oplayer/core")):"function"==typeof define&&define.amd?define(["@oplayer/core"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).OHls=t(e.OPlayer)}(this,(function(e){"use strict";const t="oplayer-plugin-hls",a=(e,t,a)=>"hls"===t.format||"m3u8"===t.format||("auto"===t.format||void 0===t.format)&&/m3u8(#|\?|$)/i.test(t.src)&&(a||!(Boolean(e.canPlayType("application/x-mpegURL"))||Boolean(e.canPlayType("application/vnd.apple.mpegURL"))));class i{constructor(e){this.key="hls",this.name=t,this.version="1.2.28-beta.1",this.options={config:{},forceHLS:!1,textControl:!0,audioControl:!0,qualityControl:!0,withBitrate:!1,qualitySwitch:"immediate",matcher:a,defaultQuality:()=>-1,defaultAudio:()=>-1,defaultSubtitle:()=>-1},Object.assign(this.options,e)}apply(e){return this.player=e,this}async load(a,l){var o;let r=a.$video;const s=this.options,u=s.matcher,c=s.forceHLS,d=s.library;if(!u(r,l,c))return!1;if(i.library||(i.library=globalThis.Hls||(d?await e.loadSDK(d,"Hls"):(await import("hls.js/dist/hls.min.js")).default)),!i.library.isSupported())return!1;const g=this.options,p=g.config,h=g.errorHandler;this.instance=new i.library(p),this.instance.attachMedia(r);const f=this.instance,v=this.player,y=document.createElement("source");return y.setAttribute("src",l.src),y.setAttribute("type",l.type||(l.type="application/x-mpegurl")),y.setAttribute("data-hls",""),r.append(y),f.on(i.library.Events.DESTROYING,(()=>{y.remove()})),f.on(i.library.Events.ERROR,(function(e,a){if(a.fatal)if("mediaError"===a.type)f.recoverMediaError();else h?h(v,a):(v.hasError=!0,v.emit("error",Object.assign({},a,{pluginName:t,message:a.type+": "+(a.reason||a.details)})))})),f.on(i.library.Events.LEVEL_LOADED,((e,t)=>{setTimeout((()=>{v.emit("canplay",t)}))})),f.loadSource(l.src),(null==(o=v.context.ui)?void 0:o.setting)&&n(v,f,this.options),this}unload(){var e;null==(e=this.instance)||e.stopLoad()}destroy(){var e;if(this.instance){const t=this.player,a=this.instance;(null==(e=t.context.ui)?void 0:e.setting)&&l(t),a.destroy()}}}const n=(e,a,n)=>{const l=e.context.ui;function o(a){const i=a.settings(),n=a.name,l=a.icon,o=a.onChange;e.context.ui.setting.unregister(t+"-"+n),e.context.ui.setting.register({name:e.locales.get(n),icon:l,onChange:o,type:"selector",key:t+"-"+n,children:i})}n.qualityControl&&(a.once(i.library.Events.LEVEL_LOADED,(()=>{if(a.levels.length<2)return;const t=n.defaultQuality(a.levels.toSorted(((e,t)=>t.bitrate-e.bitrate)));-1!=t&&(a.currentLevel=t),o({icon:l.icons.quality,name:"Quality",settings:()=>a.levels.toSorted(((e,t)=>t.bitrate-e.bitrate)).reduce(((e,i,l)=>{let o=(i.name||i.height).toString();if(isFinite(+o)&&(o+="p"),n.withBitrate){const e=i.bitrate/1e3,t=e>1e3;o+=" ("+(t?(e/1e3).toFixed(2):Math.floor(e))+(t?"m":"k")+"bps)"}return e.push({name:o,default:t==l,value:a.levels.length-1-l}),e}),[{name:e.locales.get("Auto"),default:a.autoLevelEnabled,value:-1}]),onChange(e){"immediate"==n.qualitySwitch?(a.currentLevel=e.value,-1!==e.value&&(a.loadLevel=e.value)):(a.nextLevel=e.value,-1!==e.value&&(a.nextLoadLevel=e.value))}})})),a.on(i.library.Events.LEVEL_SWITCHED,(function(i,n){let o=n.level;if(a.autoLevelEnabled){const i=a.levels[o].height,n=e.locales.get("Auto")+(i?" ("+i+"p)":"");l.setting.updateLabel(t+"-Quality",n)}else l.setting.select(t+"-Quality",o-a.levels.length,!1)}))),n.audioControl&&a.once(i.library.Events.LEVEL_LOADED,(()=>{var e;if(a.audioTracks.length<2)return;let t=n.defaultAudio(a.audioTracks);-1==t&&(t=null==(e=a.audioTracks.find((e=>{let t=e.lang;return t===navigator.language||t===navigator.language.split("-")[0]})))?void 0:e.id),-1!=t&&null!=t&&(a.audioTrack=t),o({icon:l.icons.lang,name:"Language",settings:()=>a.audioTracks.map((e=>{let a=e.name,i=e.lang,n=e.id;return{name:i||a,default:t==n,value:n}})),onChange(e){a.audioTrack=e.value}})})),n.textControl&&a.once(i.library.Events.SUBTITLE_TRACK_LOADED,(()=>{var t;if(a.subtitleTracks.length<2)return;let i=n.defaultSubtitle(a.subtitleTracks);-1==i&&(i=null==(t=a.audioTracks.find((e=>{let t=e.lang;return t===navigator.language||t===navigator.language.split("-")[0]})))?void 0:t.id),-1!=i&&null!=i&&(a.subtitleTrack=i),o({icon:l.icons.subtitle,name:"Subtitle",settings:()=>a.subtitleTracks.reduce(((e,t)=>{let a=t.name,n=t.lang,l=t.id;return e.push({name:n||a,default:i==l,value:l}),e}),[{name:e.locales.get("Off"),default:!a.subtitleDisplay,value:-1}]),onChange(e){let t=e.value;(a.subtitleDisplay=!(-1==t))&&(a.subtitleTrack=t)}})}))},l=e=>{["Quality","Language","Subtitle"].forEach((a=>e.context.ui.setting.unregister(t+"-"+a)))};return function(e){return new i(e)}}));