src/widgets/PopcornPlayer.js
author ymh <ymh.work@gmail.com>
Tue, 22 Oct 2024 09:54:34 +0200
changeset 1080 2b513bcb710a
parent 1072 ac1eacb3aa33
permissions -rw-r--r--
increment version

import jQuery from "jquery";

const PopcornPlayer = function (ns) {
  return class extends ns.Widgets.Widget {
    constructor(player, config) {
      super(player, config);
    }

    /* A Popcorn-based player for HTML5 Video, Youtube and Vimeo */

    static defaults = {};

    draw() {
      if (typeof this.video === "undefined") {
        this.video = this.media.video;
      }

      if (this.url_transform) {
        this.video = this.url_transform(this.video);
      }

      var _url = this.video;

      if (/^(https?:\/\/)?(www\.)?youtube\.com/.test(this.video)) {
        /* YOUTUBE */
        var _urlparts = this.video.split(/[?&]/),
          _params = {};
        for (var i = 1; i < _urlparts.length; i++) {
          var _ppart = _urlparts[i].split("=");
          _params[_ppart[0]] = decodeURIComponent(_ppart[1]);
        }
        _params.controls = 0;
        _params.modestbranding = 1;
        if (this.autostart || this.autoplay) {
          _params.autoplay = 1;
        }
        _url = _urlparts[0] + "?" + jQuery.param(_params);
      } // else {
      //     /* DEFAULT HTML5 */
      //     var _tmpId = ns._.uniqueId("popcorn"),
      //         _videoEl = jQuery('<video>');
      //     _videoEl.attr({
      //         id : _tmpId,
      //         width : this.width,
      //         height : this.height || undefined
      //     });
      //     if(typeof this.video === "string"){
      //         _videoEl.attr("src",this.video);
      //     } else {
      //         for (var i = 0; i < this.video.length; i++) {
      //             var _srcNode = jQuery('<source>');
      //             _srcNode.attr({
      //                 src: this.video[i].src,
      //                 type: this.video[i].type
      //             });
      //             _videoEl.append(_srcNode);
      //         }
      //     }
      //     this.$.html(_videoEl);
      // }

      var _popcorn = global.Popcorn.smart("#" + this.container, _url);

      if (this.autostart || this.autoplay) {
        _popcorn.autoplay(true);
      }

      var _media = this.media;

      // Binding functions to Popcorn

      _media.on("setcurrenttime", function (_milliseconds) {
        _popcorn.currentTime(_milliseconds / 1000);
      });

      _media.on("setvolume", function (_vol) {
        _popcorn.volume(_vol);
        _media.volume = _vol;
      });

      _media.on("setmuted", function (_muted) {
        _popcorn.muted(_muted);
        _media.muted = _muted;
      });

      _media.on("setplay", function () {
        _popcorn.play();
      });

      _media.on("setpause", function () {
        _popcorn.pause();
      });
      _media.on("settimerange", function (_timeRange) {
        _media.timeRange = _timeRange;
        try {
          if (
            _media.getCurrentTime() > _timeRange[0] ||
            _media.getCurrentTime() < _timeRange
          ) {
            _popcorn.currentTime(_timeRange[0] / 1000);
          }
        } catch (err) {}
      });
      _media.on("resettimerange", function () {
        _media.timeRange = false;
      });
      // Binding Popcorn events to media

      function getVolume() {
        _media.muted = _popcorn.muted();
        _media.volume = _popcorn.volume();
      }

      _popcorn.on("loadedmetadata", function () {
        getVolume();
        _media.trigger("loadedmetadata");
        _media.trigger("volumechange");
      });

      _popcorn.on("timeupdate", function () {
        _media.trigger(
          "timeupdate",
          new ns.Model.Time(1000 * _popcorn.currentTime())
        );
      });

      _popcorn.on("volumechange", function () {
        getVolume();
        _media.trigger("volumechange");
      });

      _popcorn.on("play", function (e) {
        _media.trigger("play");
      });

      _popcorn.on("pause", function () {
        _media.trigger("pause");
      });

      _popcorn.on("seeked", function () {
        _media.trigger("seeked");
      });
    }
  };
};

export { PopcornPlayer };