gur111 icon

download OpenU Video Recordings

gur111 | PRO | 07/30/19 03:27:53 PM UTC | 0 ⭐ | 486 👁️ | Never ⏰ | []
JavaScript |

10.99 KB

|

None

|

0 👍

/

0 👎

var downloadedFilesCounter = 0;
var numOfChunksToDownload;
var downloadQueue = [];
var currentDownloadName;
var status = "idle";
var theWindow = null;
var firstTimeOpenWindow = 1;
 
var chunksBaseUrl, quality, chunksURLQuery;
 
function updataStatus(){
    downloadedFilesCounter++;
    let completedPercentage = (downloadedFilesCounter / (numOfChunksToDownload+1) ) ;
    let fullWidth = $("#progressBar"+downloadQueue[0].playlistid).width();
    let percentageDivWidth = $("#progressBarPercent"+downloadQueue[0].playlistid).width();
    let updatedWidth = parseInt(completedPercentage*fullWidth);
    if ( updatedWidth > percentageDivWidth)
        $("#progressBarPercent"+downloadQueue[0].playlistid).css("width", updatedWidth);
    if ( downloadedFilesCounter == (numOfChunksToDownload+1)  )
        $("#progressBarPercent"+downloadQueue[0].playlistid).css({"background-color": "#e91e63", "width":"100%"}).text("ההורדה הושלמה!");
    else
        $("#progressBarPercent"+downloadQueue[0].playlistid).text("בהורדה: " + parseInt(completedPercentage*100) + "%");
}
 
var tmrCheckPlaylistLoad;
var currentOpenCollectionId = $("#ovc_collections_list").find("li.active").find("a").attr("c-value");
addDownloadButtons(currentOpenCollectionId);
 
// add click event for all download buttons
$(document).on("click", ".downloadButton", function(){
    var url = "https://opal.openu.ac.il/mod/ouilvideocollection/actions.php";
    var context = $(this).attr('context');
    var playlistId = $(this).attr('playlistid');
    downloadQueue.push( { context: context, playlistid: playlistId } );
 
    // add progress bar
    let videoTop = $("#playlist"+playlistId).find(".ovc_playlist_border");
    let progressBarDiv = $("<div id='progressBar"+playlistId+"'></div>").css({"background-color": "#01579B"});
    let progressBarPercentDiv = $("<div id='progressBarPercent"+playlistId+"'>ממתין להתחלת הורדה... <a href='javascript:void(0);' class='cancelDownload' context="+context+" playlistid="+playlistId+" style='color:lightgreen;font-size: 120%;margin-right:10px;'><b>בטל</b></a></div>").css({"color": "white"});
    progressBarDiv.append(progressBarPercentDiv);
    videoTop.prepend(progressBarDiv);
 
    $(".downloadButton[playlistid="+playlistId+"]").hide();
 
    getVideosOnQueue();
});
 
// add click event for all cancel download buttons
$(document).on("click", ".cancelDownload", function(){
    var playlistId = $(this).attr('playlistid');
    downloadQueue = downloadQueue.filter(video => video.playlistid !== playlistId );
    $("#progressBar"+playlistId).remove();
    $(".downloadButton[playlistid="+playlistId+"]").show();
});
 
 
// automatically add download buttons when a new collection is loaded
function onPlaylistLoad(){
    $(".collection_link").each(function(){
        $(this).on("click", function(){
            var cValue = $(this).attr("c-value");
            tmrCheckPlaylistLoad = setInterval(function(){handleCollectionChange(cValue)}, 300);
        });  
    }); 
}
onPlaylistLoad();
 
function handleCollectionChange (cValue) {
    if( $('#collection'+cValue).is(':visible') ){ 
        addDownloadButtons(cValue);
        clearInterval(tmrCheckPlaylistLoad);
    }
}
 
// adds download buttons to an open collection( a collection that has been loaded )
function addDownloadButtons(collectionId) {
    // add buttons only if not been added before
    if ( $( "#collection"+collectionId ).find("button").length == 0 ) {
        var collectionDiv = $("#collection"+collectionId);
        var currentContext = collectionDiv.attr("cid");
        var videoCount = 0;
        collectionDiv.children().each(function(i) {
            let videoDescription = $(this).find("span.instructor_row");
            let currentPlaylistId = $(this).attr("id").substring(8);
            let buttonElement = $("<button></button>").text("הורד סרטון").attr('class','downloadButton').attr('context',currentContext).attr('playlistid',currentPlaylistId);
            buttonElement.css({"margin-right":"10px","background":"rgb(202, 60, 60)","color":"white","borderRadius":"4px","textShadow":"0 1px 1px rgba(0, 0, 0, 0.2)"});
            videoDescription.append(buttonElement);
        }); 
    }
}
 
 
function getPlaylistFile(context, playlistid){
    var courseIdStart = $('.coursename_header').children()[0].href.indexOf("id=");
    var courseIdNum = $('.coursename_header').children()[0].href.substring(courseIdStart+3);
    jQuery.ajax({
        type: "POST",
        url: "https://opal.openu.ac.il/mod/ouilvideocollection/actions.php",
        data: {action: "getplaylist", context: context, playlistid: playlistid, course: courseIdNum},
        success: function(data) {
          let anotherURL = "https://opal.openu.ac.il/local/ouil_video/player.php?mediaid=" + data.media.cipher;
          currentDownloadName = data.title;
           
                    $.get(anotherURL, function(data) {
                        let mediaStart = data.indexOf("media: ");
                        let mediaEnd = data.indexOf("\"", mediaStart+11);
                        let myMedia = data.substring(mediaStart+8, mediaEnd);
                        let url = myMedia;
 
                        $.get(url, function(data) {
                            let playlistStart = data.indexOf("file=")+5;
                            let playlistEnd = data.indexOf("\"", playlistStart+8);
                            var playlistURL = data.substring(playlistStart+1, playlistEnd).replace("&amp;", "&");
                            let url = playlistURL;
                        
                            $.get(url, function(data) {
                                let baseURL = playlistURL.substring(0, playlistURL.indexOf("playlist."))
                                let quality_list = data.match(/BANDWIDTH=\d+/g).map(function(n){return parseInt(n.replace("BANDWIDTH=", ""))}).sort(function(a,b){ return a-b; });
                                let highestQuality = quality_list[quality_list.length-1];
                                let URLQuery = playlistURL.substring(playlistURL.indexOf("?"));
 
                                chunksBaseUrl = baseURL;
                                quality = highestQuality;
                                chunksURLQuery = URLQuery;
                                let url = chunksBaseUrl+"chunklist_b"+quality+".m3u8"+chunksURLQuery;
                                $.get(url, function(data) {
                                    data = data.split("\n");
                                    let lastChunkLine = data[data.length-3];
                                    let lastChunkStart = lastChunkLine.indexOf("_", lastChunkLine.indexOf(quality));
                                    let lastChunkEnd = lastChunkLine.indexOf(".ts");
                                    let lastChunkNum = lastChunkLine.substring(lastChunkStart+1, lastChunkEnd);
                                    numOfChunksToDownload = parseInt(lastChunkNum);
                                    startVideoDownload();
                                });
                            });
                        }, "text");   
                    });     
        }
    });    
}
 
function getVideosOnQueue(){
    if ( downloadQueue.length > 0 && status === "idle"  ){
        status = "downloading";        
        $("#progressBar"+downloadQueue[0].playlistid).css({"background-color": "#ddd"});
        $("#progressBarPercent"+downloadQueue[0].playlistid).css({"background-color": "#4CAF50", "display": "inline-block", "font-weight": "bold"}).html("בהורדה: 0%");
        getPlaylistFile(downloadQueue[0].context, downloadQueue[0].playlistid);
    }
}
 
function startVideoDownload(){
    if ( theWindow === null ){
        theWindow = window.open('https://opal.openu.ac.il/'+new Date().getTime(), "", 'toolbar=no,status=no,width=250,height=100');
        if (theWindow == null || typeof(theWindow)=='undefined') {  
            alert('יש לאפשר פתיחת חלון נוסף (popup). ליד שורת הכתובת בדפדפן מופיע סימן קטן של אפשרות לאפשר popup,\n יש ללחוץ עליו ולבחור ב "Always allow pop-ups from. לאחר מכאן לרענן את הדף ולהפעיל שוב את הסקריפט. אחרי פעולה זה הסקריפט יפעל כהלכה.'); 
        } 
    }
    var theDoc = theWindow.document,
    theScript = document.createElement('script');
 
    function injectThis() {
        var fileData = [];
 
        function addData(data, index){
            fileData[index] = data;
            window.opener.updataStatus(); 
            if ( window.opener.downloadedFilesCounter == (window.opener.numOfChunksToDownload+1) ){
                saveDownloadedFile();
                setTimeout(function(){window.opener.windowFinishedDownloading()}, 200);                
            }
        }
 
        function startVideoDownload(chunksBaseUrl, quality, chunksURLQuery){
            for (i = 0; i <= window.opener.numOfChunksToDownload; i++) { 
                let currentIndex = i;
                let xhr = new XMLHttpRequest();
                let url=chunksBaseUrl+"media_b"+quality+"_"+i+".ts"+chunksURLQuery;
                xhr.open('GET', url, true);
                xhr.responseType = 'blob';
                xhr.onload = function(e) {
                     addData(xhr.response, currentIndex);
                }
                xhr.addEventListener("error", function(){ retryFailedRequest(chunksBaseUrl, quality, chunksURLQuery, currentIndex); });  
                xhr.send();
            }
        }
 
        function retryFailedRequest(chunksBaseUrl, quality, chunksURLQuery, chunkNumber){
            let currentIndex = chunkNumber;
            let xhr = new XMLHttpRequest();
            let url = chunksBaseUrl+"media_b"+quality+"_"+currentIndex+".ts"+chunksURLQuery;
            xhr.open('GET', url, true);
            xhr.responseType = 'blob';
            xhr.onload = function(e) {
                addData(xhr.response, currentIndex);
            }
            xhr.addEventListener("error", function(){ setTimeout(function(){ retryFailedRequest(chunkStartUrl, chunkEndNameWithoutExtension, chunkNumber); }, 5000); });
            xhr.send();
        }
 
        function saveDownloadedFile() {
            let blob = new Blob(fileData, {type: "video/mp2t"});
            let a = document.body.appendChild(document.createElement('a'));
            let objectURL2 = URL.createObjectURL(blob);
            a.href = objectURL2;
            a.download = window.opener.currentDownloadName+".ts";
            a.click();
            a.remove(a);
 
            URL.revokeObjectURL(objectURL2);
            blob = null;
            a = null;
 
            // reset data for next download
            fileData = [];
            window.opener.downloadedFilesCounter = 0;
            window.opener.status = "idle";
            window.opener.downloadQueue.shift();  
        }
        
        startVideoDownload(window.opener.chunksBaseUrl, window.opener.quality, window.opener.chunksURLQuery);
    }
    if ( firstTimeOpenWindow ){
        theScript.innerHTML = 'window.onload = ' + injectThis.toString() + ';';
        firstTimeOpenWindow = 0;
    }
    else {
        theScript.innerHTML = injectThis.toString() + 'injectThis();';
    }
    theDoc.body.appendChild(theScript);   
}
 
function windowFinishedDownloading(){
    if ( downloadQueue.length === 0 ){
        theWindow.close();
        theWindow = null;
        firstTimeOpenWindow = 1;
    }
    else {        
        theWindow.location.reload();
        getVideosOnQueue();
    }
}

Comments