ssr.js 5.63 KB
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.install = exports.videoPlayer = exports.videojs = undefined;

var _video = require('video.js');

var _video2 = _interopRequireDefault(_video);

var _objectAssign = require('object-assign');

var _objectAssign2 = _interopRequireDefault(_objectAssign);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var DEFAULT_EVENTS = ['loadeddata', 'canplay', 'canplaythrough', 'play', 'pause', 'waiting', 'playing', 'ended', 'error'];

var videoPlayerDirective = function videoPlayerDirective(globalOptions) {
  globalOptions.events = globalOptions.events || [];
  globalOptions.options = globalOptions.options || {};

  var getInstanceName = function getInstanceName(el, binding, vnode) {
    var instanceName = null;
    if (binding.arg) {
      instanceName = binding.arg;
    } else if (vnode.data.attrs && (vnode.data.attrs.instanceName || vnode.data.attrs['instance-name'])) {
      instanceName = vnode.data.attrs.instanceName || vnode.data.attrs['instance-name'];
    } else if (el.id) {
      instanceName = el.id;
    }
    return instanceName || 'player';
  };

  var repairDom = function repairDom(el) {
    if (!el.children.length) {
      var video = document.createElement('video');
      video.className = 'video-js';
      el.appendChild(video);
    }
  };

  var initPlayer = function initPlayer(el, binding, vnode) {

    var self = vnode.context;
    var attrs = vnode.data.attrs || {};
    var options = binding.value || {};
    var instanceName = getInstanceName(el, binding, vnode);
    var customEventName = attrs.customEventName || 'statechanged';
    var player = self[instanceName];

    var componentEvents = attrs.events || [];
    var playsinline = attrs.playsinline || false;

    if (playsinline) {
      el.children[0].setAttribute('playsinline', playsinline);
      el.children[0].setAttribute('webkit-playsinline', playsinline);
      el.children[0].setAttribute('x5-playsinline', playsinline);
      el.children[0].setAttribute('x5-video-player-type', 'h5');
      el.children[0].setAttribute('x5-video-player-fullscreen', false);
    }

    if (attrs.crossOrigin) {
      el.children[0].crossOrigin = attrs.crossOrigin;
      el.children[0].setAttribute('crossOrigin', attrs.crossOrigin);
    }

    if (!player) {
      var videoOptions = (0, _objectAssign2.default)({}, {
        controls: true,
        controlBar: {
          remainingTimeDisplay: false,
          playToggle: {},
          progressControl: {},
          fullscreenToggle: {},
          volumeMenuButton: {
            inline: false,
            vertical: true
          }
        },
        techOrder: ['html5'],
        plugins: {}
      }, globalOptions.options, options);

      if (videoOptions.plugins) {
        delete videoOptions.plugins.__ob__;
      }

      var eventEmit = function eventEmit(vnode, name, data) {
        var handlers = vnode.data && vnode.data.on || vnode.componentOptions && vnode.componentOptions.listeners;
        if (handlers && handlers[name]) handlers[name].fns(data);
      };

      var emitPlayerState = function emitPlayerState(event, value) {
        if (event) {
          eventEmit(vnode, event, player);
        }
        if (value) {
          eventEmit(vnode, customEventName, _defineProperty({}, event, value));
        }
      };

      player = self[instanceName] = (0, _video2.default)(el.children[0], videoOptions, function () {
        var _this = this;

        var events = DEFAULT_EVENTS.concat(componentEvents).concat(globalOptions.events);

        var onEdEvents = {};
        for (var i = 0; i < events.length; i++) {
          if (typeof events[i] === 'string' && onEdEvents[events[i]] === undefined) {
            (function (event) {
              onEdEvents[event] = null;
              _this.on(event, function () {
                emitPlayerState(event, true);
              });
            })(events[i]);
          }
        }

        this.on('timeupdate', function () {
          emitPlayerState('timeupdate', this.currentTime());
        });

        emitPlayerState('ready');
      });
    }
  };

  var disposePlayer = function disposePlayer(el, binding, vnode) {
    var self = vnode.context;
    var instanceName = getInstanceName(el, binding, vnode);
    var player = self[instanceName];
    if (player && player.dispose) {
      if (player.techName_ !== 'Flash') {
        player.pause && player.pause();
      }
      player.dispose();
      repairDom(el);
      self[instanceName] = null;
      delete self[instanceName];
    }
  };

  return {
    inserted: initPlayer,

    bind: function bind(el, binding, vnode) {
      repairDom(el);
    },
    update: function update(el, binding, vnode) {
      var options = binding.value || {};
      disposePlayer(el, binding, vnode);
      if (options && options.sources && options.sources.length) {
        initPlayer(el, binding, vnode);
      }
    },

    unbind: disposePlayer
  };
};

var videoPlayer = videoPlayerDirective({});

var install = function install(Vue) {
  var globalOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
    options: {},
    events: []
  };

  Vue.directive('video-player', videoPlayerDirective(globalOptions));
};

var VueVideoPlayer = { videojs: _video2.default, videoPlayer: videoPlayer, install: install };

exports.default = VueVideoPlayer;
exports.videojs = _video2.default;
exports.videoPlayer = videoPlayer;
exports.install = install;