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 = $("
").css({"background-color": "#01579B"}); let progressBarPercentDiv = $("
ממתין להתחלת הורדה... בטל
").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 = $("").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("&", "&"); 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(); } }