UNPKG

xgplayer-dash

Version:
242 lines (241 loc) 7.75 kB
import { inherits as _inherits, createSuper as _createSuper, createClass as _createClass, classCallCheck as _classCallCheck, assertThisInitialized as _assertThisInitialized, typeof as _typeof } from "./_virtual/_rollupPluginBabelHelpers.js"; import { Events, BasePlugin } from "xgplayer"; import DASH from "./dash.js"; import Task from "./media/task.js"; var errorHandle = function errorHandle2(player, err) { err.vid = player.config.vid; err.url = player.src; if (err.errd && _typeof(err.errd) === "object") { if (player.dash) { err.errd.url = player.dash.url; err.url = player.dash.url; } } player.emit("DATA_REPORT", err); if (err.errt === "network" && player.config._backupURL) { player.src = player.config._backupURL; } else { player.src = player.config._mainURL; } player.switchURL = null; player._replay = null; }; var DashPlugin = /* @__PURE__ */ function(_BasePlugin) { _inherits(DashPlugin2, _BasePlugin); var _super = _createSuper(DashPlugin2); function DashPlugin2(options) { var _this; _classCallCheck(this, DashPlugin2); _this = _super.call(this, options); _this.definitions = []; _this.destroy = _this.destroy.bind(_assertThisInitialized(_this)); _this.timeUpdate = _this.timeUpdate.bind(_assertThisInitialized(_this)); _this.replay = _this.replay.bind(_assertThisInitialized(_this)); _this.initEvents(); return _this; } _createClass(DashPlugin2, [{ key: "initEvents", value: function initEvents() { this.on(Events.DESTROY, this.destroy); this.on(Events.TIME_UPDATE, this.timeUpdate); this.on(Events.REPLAY, this.replay); } }, { key: "beforePlayerInit", value: function beforePlayerInit() { var _this2 = this; var player = this.player, playerConfig = this.playerConfig; if (this.config.drm) { if (!navigator.requestMediaKeySystemAccess) { console.log("EME API is not supported. Enable pref media.eme.enabled to true in about:config"); return; } } var dash = new DASH(playerConfig.url, playerConfig, player.video); return dash.init(playerConfig.url).then(function(res) { if (!_this2.definitions.length) { dash.mpd.mediaList.video.forEach(function(item) { _this2.definitions.push({ name: item.height + "P", url: item.id, selected: false }); }); _this2.definitions[0].selected = true; } player.emit("resourceReady", _this2.definitions); var mse = res; _this2.dash = dash; _this2.mse = mse; dash.on("error", function(err) { errorHandle(player, err); }); dash.once("startPlay", function() { _this2.progressTimer = setInterval(function() { _this2.timeUpdate(); }, 300); }); try { BasePlugin.defineGetterOrSetter(_this2.player, { __url: { get: function get() { return _this2.mse.url; } } }); } catch (e) { } }); } }, { key: "loadData", value: function loadData() { var time = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.player.currentTime; var dash = this.dash; var range = this.findRangeForPlaybackTime(time); var appendTime = range && range.end || time; if (appendTime > time + 15) return; dash.seek(appendTime); } }, { key: "download", value: function download() { this.dash.download(); } }, { key: "findRangeForPlaybackTime", value: function findRangeForPlaybackTime(time) { var player = this.player; var ranges = player.buffered; if (!ranges) return; for (var i = 0; i < ranges.length; i++) { if (ranges.start(i) <= time && ranges.end(i) >= time) { return { start: ranges.start(i), end: ranges.end(i) }; } } } }, { key: "switchURL", value: function switchURL(url) { var player = this.player; player.config.url = url; player.hasStart = false; if (!player.paused) { player.pause(); player.once("pause", function() { player.start(url); }); player.once("canplay", function() { player.play(); }); } else { player.start(url); } player.once("canplay", function() { player.currentTime = 0; }); } }, { key: "timeUpdate", value: function timeUpdate() { var player = this.player, dash = this.dash; this.loadData(player.currentTime + 1); this.isEnded(player, dash); } }, { key: "switchBW", value: function switchBW(idx) { var _this3 = this; var dash = this.dash; idx = idx.split("/")[idx.split("/").length - 1]; var vl = dash.mpd.mediaList.video; var newIdx = vl.selectedIdx; vl.every(function(item, index) { if (item.id === idx) { newIdx = index; dash.getData(vl[newIdx].initSegment, vl[newIdx].initSegmentRange).then(function(videoInitRes) { changeBitWidth(videoInitRes); }); return false; } else { return true; } }); var changeBitWidth = function changeBitWidth2(videoInitRes) { var player = _this3.player; var curTime = player.currentTime; var temp = vl[vl.selectedIdx].mediaSegments.find(function(item) { return item.start - curTime > 6; }); var start = temp.start; var end = player.getBufferedRange()[1]; if (end - start > 0 && BasePlugin.Sniffer.browser !== "safari") { player.mse.removeBuffer("".concat(vl[0].mimeType, ';codecs="').concat(vl[0].codecs, '"'), start, end); } vl[vl.selectedIdx].mediaSegments.every(function(item) { item.downloaded = false; return true; }); _this3.mse.appendBuffer("".concat(vl[0].mimeType, ';codecs="').concat(vl[0].codecs, '"'), videoInitRes); _this3.mse.once("".concat(vl[0].mimeType, ';codecs="').concat(vl[0].codecs, '" updateend'), function() { vl[newIdx].inited = true; vl.selectedIdx = newIdx; _this3.loadData((temp.start + temp.end) / 2); }); }; } }, { key: "replay", value: function replay() { var player = this.player; Task.clear(); var selectedIdx = this.dash.mpd.mediaList.video.selectedIdx; this.definitions[selectedIdx].selected = true; player.hasStart = false; player.start(); this.once(Events.COMPLETE, function() { player.play(); }); } }, { key: "isEnded", value: function isEnded() { var dash = this.dash, player = this.player, mse = this.mse; if (dash.type === "vod") { if (player.duration - player.currentTime < 2) { var range = player.getBufferedRange(); if (player.currentTime - range[1] < 0.1) { mse.endOfStream(); if (this.progressTimer) { clearInterval(this.progressTimer); this.progressTimer = null; } } } } } }, { key: "destroy", value: function destroy() { if (this.dash) { window.clearTimeout(this.dash.mpd.timer); } if (this.progressTimer) { clearInterval(this.progressTimer); } } }], [{ key: "pluginName", get: function get() { return "DashPlugin"; } }]); return DashPlugin2; }(BasePlugin); export { DashPlugin as default };