Brightcove视频播放器的下载按钮

问题描述

我们正在努力满足一项要求,即在一个页面上有多个Brightcove视频。

播放器控制栏中的视频需要有一个下载按钮。

我们尝试使用Brightcove Player Sample: Download Video Plugin

但是问题是下载按钮有时会在同一页面上出现一次。对于一个负载,它出现,而对于其他负载,它不出现。

任何人都可以帮助解决此问题。

我们的代码如下:

"use strict";
(function($,Drupal,drupalSettings) {
    Drupal.behaviors.teste = {
        attach: function attach(context) {
            var registerPlugin = videojs.registerPlugin || videojs.plugin;

            function download(data,strFileName,strMimeType) {
                var self = window,defaultMime = "application/octet-stream",mimeType = strMimeType || defaultMime,payload = data,url = !strFileName && !strMimeType && payload,anchor = document.createElement("a"),toString = function toString(a) {
                        return String(a);
                    },myBlob = self.Blob || self.MozBlob || self.WebKitBlob || toString,fileName = strFileName || "download",blob,reader;
                myBlob = myBlob.call ? myBlob.bind(self) : Blob;
                if (String(this) === "true") {
                    payload = [payload,mimeType];
                    mimeType = payload[0];
                    payload = payload[1];
                }
                if (url && url.length < 2048) {
                    fileName = url.split("/").pop().split("?")[0];
                    anchor.href = url;
                    if (anchor.href.indexOf(url) !== -1) {
                        var ajax = new XMLHttpRequest();
                        ajax.open("GET",url,true);
                        ajax.responseType = "blob";
                        ajax.onload = function(e) {
                            download(e.target.response,fileName,defaultMime);
                        };
                        setTimeout(function() {
                            ajax.send();
                        },0);
                        return ajax;
                    }
                }
                if (/^data\:[\w+\-]+\/[\w+\-]+[,;]/.test(payload)) {
                    if (payload.length > 1024 * 1024 * 1.999 && myBlob !== toString) {
                        payload = dataUrlToBlob(payload);
                        mimeType = payload.type || defaultMime;
                    } else {
                        return navigator.msSaveBlob ? navigator.msSaveBlob(dataUrlToBlob(payload),fileName) : saver(payload);
                    }
                }
                blob = payload instanceof myBlob ? payload : new myBlob([payload],{
                    type: mimeType
                });

                function dataUrlToBlob(strUrl) {
                    var parts = strUrl.split(/[:;,]/),type = parts[1],decoder = parts[2] == "base64" ? atob : decodeURIComponent,binData = decoder(parts.pop()),mx = binData.length,i = 0,uiArr = new Uint8Array(mx);
                    for (i; i < mx; ++i) {
                        uiArr[i] = binData.charCodeAt(i);
                    }
                    return new myBlob([uiArr],{
                        type: type
                    });
                }

                function saver(url,winMode) {
                    if ("download" in anchor) {
                        anchor.href = url;
                        anchor.setAttribute("download",fileName);
                        anchor.className = "download-js-link";
                        anchor.innerHTML = "downloading...";
                        anchor.style.display = "none";
                        document.body.appendChild(anchor);
                        setTimeout(function() {
                            anchor.click();
                            document.body.removeChild(anchor);
                            if (winMode === true) {
                                setTimeout(function() {
                                    self.URL.revokeObjectURL(anchor.href);
                                },250);
                            }
                        },66);
                        return true;
                    }
                    if (/(Version)\/(\d+)\.(\d+)(?:\.(\d+))?.*Safari\//.test(navigator.userAgent)) {
                        url = url.replace(/^data:([\w\/\-\+]+)/,defaultMime);
                        if (!window.open(url)) {
                            if (confirm("displaying New Document\n\nUse Save As... to download,then click back to return to this page.")) {
                                location.href = url;
                            }
                        }
                        return true;
                    }
                    var f = document.createElement("iframe");
                    document.body.appendChild(f);
                    if (!winMode) {
                        url = "data:" + url.replace(/^data:([\w\/\-\+]+)/,defaultMime);
                    }
                    f.src = url;
                    setTimeout(function() {
                        document.body.removeChild(f);
                    },333);
                }
                if (navigator.msSaveBlob) {
                    return navigator.msSaveBlob(blob,fileName);
                }
                if (self.URL) {
                    saver(self.URL.createObjectURL(blob),true);
                } else {
                    if (typeof blob === "string" || blob.constructor === toString) {
                        try {
                            return saver("data:" + mimeType + ";base64," + self.btoa(blob));
                        } catch (y) {
                            return saver("data:" + mimeType + "," + encodeURIComponent(blob));
                        }
                    }
                    reader = new FileReader();
                    reader.onload = function(e) {
                        saver(this.result);
                    };
                    reader.readAsDataURL(blob);
                }
                return true;
            };

            function removeSpaces(str) {
                str = str.replace(/\s/g,'');
                return str;
            }

            function changeDottoUnderline(str) {
                str = str.replace(/\./g,'_');
                return str;
            }
            registerPlugin("downloadButton",function() {
                var myPlayer = this,videoName,totalRenditions,mp4ara = [],highestQuality,spacer,rendtionSara,newElement = document.createElement("div"),newImage = document.createElement("img");
                myPlayer.on("loadstart",function() {
                    mp4ara = [];
                    videoName = myPlayer.mediainfo["name"];
                    videoName = removeSpaces(videoName);
                    videoName = changeDottoUnderline(videoName);
                    rendtionSara = myPlayer.mediainfo.sources;
                    totalRenditions = rendtionSara.length;
                    for (var i = 0; i < totalRenditions; i++) {
                        if (rendtionSara[i].container === "MP4" && rendtionSara[i].hasOwnProperty("src")) {
                            mp4ara.push(rendtionSara[i]);
                        }
                    }
                    mp4ara.sort(function(a,b) {
                        return b.size - a.size;
                    });
                    highestQuality = mp4ara[0].src;
                    newElement.id = "downloadImage";
                    newElement.className = "vjs-control downloadStyle";
                    newImage.setAttribute("src","https://solutions.brightcove.com/bcls/brightcove-player/download-video/file-download.png");
                    newImage.style["cursor"] = "pointer";
                    newImage.onclick = function() {
                        var x = new XMLHttpRequest();
                        x.open("GET",true);
                        x.responseType = 'blob';
                        x.onload = function(e) {
                            download(x.response,"video/mp4");
                        };
                        x.send();
                    };
                    newElement.appendChild(newImage);
                    spacer = myPlayer.controlBar.customControlSpacer.el();
                    spacer.setAttribute("style","justify-content: flex-end;");
                    spacer.appendChild(newElement);
                });
            });
            var i = 0;
            $.each($('.video-js'),function() {
                var video = $(this);
                if (video.length > 0 && drupalSettings.downloadOption == 'yes') {
                    $(this).attr('id',$(this).attr('id') + i);
                    var videoId = video.attr('id');
                    videojs.getPlayer('#' + videoId).ready(function() {
                        var player = this;
                        player.downloadButton();
                    });
                }
                i++;
            });
        }
    };
})(jQuery,drupalSettings); 

我们正在尝试将其集成到Drupal CMS。

我们还在页面加载上看到警告

VIDEOJS: WARN: A plugin named "reloadSourceOnError" already exists. You may want to avoid re-registering plugins!
VIDEOJS: Ignoring already initialized player

Player with download button

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)