Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name YT Downloader +8K
- // @namespace http://tampermonkey.net/
- // @version 3.0
- // @description try to take over the world!
- // @author You
- // @match https://www.youtube.com/*
- // @include file:///*
- // @grant none
- // @require https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
- // @require https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js
- // ==/UserScript==
- var $, c;
- var vtitle;
- var sidebar;
- var ad, dqt, dfps, dopt;
- (function(){
- c = this.jQuery = jQuery.noConflict(false);
- $ = this.jQuery = jQuery.noConflict(false);
- var start = function(){
- if(!window.location.href.includes("watch?v=") || $(".btn-small")[0])
- return;
- var vsch = $(".title.style-scope.ytd-video-primary-info-renderer");
- if(vsch[0] == null){
- setTimeout(function(){
- start();
- }, 1000);
- return;
- }
- vsch.css("display", "inline-block");
- vtitle = vsch[0].innerText;
- var sb = $("<div style='width: 100%; background-color: #fff; transition: max-height 1s ease-out; max-height: 0; height: 300px; overflow: hidden; position: relative'></div>");
- $("#offer-module").prepend(sb);
- $("<style>@import url('https://fonts.googleapis.com/css?family=Roboto');" +
- ".btn-small{font-family: 'Roboto', sans-serif; cursor: pointer; font-size: 1rem; color: #fff; background-color: #09f; border-radius: 2px; display: inline-block; margin-left: 4px; min-width: 3rem; padding: 0 6px 0 6px; text-align: center; line-height: 22px; height: 22px; letter-spacing; 0.5px}" +
- ".progress{max-width: 0%; width: 100%; height: 4px; transition: max-width 0.3s ease-out, opacity 0.3s ease-out; background-color: #09f}" +
- ".btn-dm{font-family: 'Roboto', sans-serif; color: #666; transition: background-color: 0.3s ease-out; text-align: center; width: 100%; padding: 16px 0 16px 0; margin: 0}" +
- ".btn-dm:hover{background-color: #ddd}" +
- ".text{font-size: 1.25rem; font-family: 'Roboto', sans-serif; margin: 0; letter-spacing; 0.5px}" +
- ".downitem{font-family: 'Roboto', sans-serif; border-radius: 1px; background-color: #fdfdfd; height: 90px; width: 95%; overflow: hidden; margin: 0 auto 10px auto; line-height: 1.5; font-size: 100%; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .03), 0 1px 4px 0 rgba(0, 0, 0, .048), 0 3px 1px -2px rgba(0, 0, 0, .12);}</style>").insertAfter(sb);
- var load = $("<div class='progress' style='position: relative; overflow: visible'></div>");
- load.append("<div style='width: 30px; height: 100%; position: absolute; right: 0; box-shadow: 0 0 5px #09f'></div>");
- sb.append(load);
- var sbi = $("<div style='width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0); overflow-x: hidden; margin-top: 32px'></div>");
- var te = $("<div style='width: 100%; height: 32px; position: absolute; top: 0'></div>");
- var back = $('<div style="width: 32px; height: 32px; opacity: 0; display: inline-block; background-color: rgba(0, 0, 0, 0)"><svg style="fill: #09f; width: 20px; height: 20px; margin: 6px 0 0 6px"><path d="M15,0 5,10 15,20 15,19 6,10 15,1 Z"></path></svg></div>');
- te.append(back);
- sb.append(sbi);
- sb.append(te);
- sidebar = {show: function(){
- sb.css("max-height", "300px");
- sb.css("margin-bottom", "10px");
- }, loading: function(l){
- if(!l){
- load.css("transition", "max-width 0s linear");
- load.css("max-width", "0%");
- setTimeout(function(){
- load.css("transition", "");
- }, 0);
- }
- load.css("opacity", l == 100 ? 0 : 1);
- load.css("max-width", l + "%");
- }, back: function(f){
- if(f !== null){
- back.css("opacity", 1);
- back.unbind("click");
- back.on("click", f);
- }else
- back.css("opacity", 0);
- }, element: sbi};
- if(window.location.href.includes("&d=t")){
- var args = window.location.href.split("&");
- for(var i in args){
- if(args[i].startsWith("dqt")){
- ad = true;
- dqt = args[i].substring(4);
- }if(args[i].startsWith("dfps")){
- ad = true;
- dfps = args[i].substring(5);
- }if(args[i].startsWith("dopt"))
- dopt = args[i].substring(5);
- }
- begin();
- return;
- }
- var down = $('<span class="btn-small">Download</span>');
- vsch.append(down);
- down.click(function(){
- down.remove();
- begin();
- });
- };
- $(document).ready(function(){
- setTimeout(start, 1000);
- });
- window.onpopstate = function(){
- setTimeout(start, 1000);
- };
- (function(push){
- window.history.pushState = function(){
- setTimeout(start, 1000);
- push.apply(this, arguments);
- };
- })(window.history.pushState);
- })();
- function begin(){
- sidebar.show();
- sidebar.loading(0);
- var dcb = function(st){
- var as = [];
- sidebar.back(function(){
- begin();
- });
- var sb = sidebar.element;
- sb.empty();
- sb.append("<span style='font-size: 1.75em; margin: 0 0 0 10px' class='text'>Download</span>");
- var adl;
- parseURLs(st, function(p){
- //sidebar.loading(p);
- }, function(l){
- if(l.mime.startsWith("video")){
- var btn = $('<div class="btn-dm"><span class="text">' + l.quality + 'p' + l.fps + ' ' + l.mime.substring(6, l.mime.indexOf(";")).toUpperCase() + ' ' + Math.round(l.length / 10000) / 100 + ' MBytes</span></div>');
- btn.click(function(){
- if(as.length && MediaSource.isTypeSupported(l.mime) && MediaSource.isTypeSupported(as[0].mime))
- downopt(l, as[0]);
- });
- sb.append(btn);
- if(!adl && ad && (dqt || dfps) && (!dqt || l.quality == dqt) && (!dfps || l.fps == dfps))
- adl = l;
- }if(l.mime.startsWith("audio"))
- as.push(l);
- }, function(){
- dfps = null;
- dqt = null;
- if(adl && as.length && MediaSource.isTypeSupported(adl.mime) && MediaSource.isTypeSupported(as[0].mime))
- downopt(adl, as[0]);
- });
- //sidebar.loading(0);
- };
- getDownloadURLs(function(p){
- sidebar.loading(p);
- }, dcb);
- }
- var urlcache;
- function getDownloadURLs(pcb, r){
- var scripts = $("script");
- if(urlcache)
- r(urlcache);
- else
- for(var i in scripts)
- if(scripts[i].innerText != null && scripts[i].innerText.includes("ytplayer") && scripts[i].innerText.includes("adaptive_fmts"))
- r(urlcache = scripts[i].innerText);
- var x = new XMLHttpRequest();
- x.open("GET", window.location.href);
- x.onprogress = function(e){
- if(e.lengthComputable)
- pcb((this.readyState + e.loaded / e.total) * 25);
- };
- x.onreadystatechange = function(){
- pcb(this.readyState * 25);
- if(this.readyState == 4)
- if(this.status == 200){
- var scripts = $(this.responseText).find("script");
- for(var i in scripts)
- if(scripts[i].innerText != null && scripts[i].innerText.includes("ytplayer") && scripts[i].innerText.includes("adaptive_fmts")){
- urlcache = scripts[i].innerText;
- return;
- }
- x.open("GET", window.location.href);
- x.send();
- }else{
- x.open("GET", window.location.href);
- x.send();
- }
- };
- x.send();
- }
- function parseURLs(st, pcb, lcb, dcb){
- var linksraw = st.substring(st.indexOf("adaptive_fmts") + 16, st.indexOf("\"", st.indexOf("adaptive_fmts") + 16)).split(/,/);
- for(var i in linksraw){
- var params = linksraw[i].split("\\u0026");
- var url, type, quality, fps, length;
- for(var j in params){
- pcb(100 * (i + j / params.length) / linksraw.length);
- if(params[j].startsWith("url"))
- url = params[j].substring(4);
- else if(params[j].startsWith("type"))
- type = params[j].substring(5);
- else if(params[j].startsWith("size"))
- quality = params[j].substring(5);
- else if(params[j].startsWith("fps"))
- fps = params[j].substring(4);
- else if(params[j].startsWith("clen"))
- length = params[j].substring(5);
- }
- lcb({url: decodeURI(decodeURIComponent(url)), mime: decodeURIComponent(type), length: length, quality: quality, fps: fps});
- }
- dcb();
- }
- function downopt(v, a){
- sidebar.back(function(){
- begin();
- });
- var sb = sidebar.element;
- sb.empty();
- var sd = $('<div class="btn-dm"><span class="text">Stream to device and save files</span></div>');
- var dd = $('<div class="btn-dm"><span class="text">Direct download</span></div>');
- sb.append("<span style='font-size: 1.75em; margin: 0 0 0 10px' class='text'>Method</span>");
- sb.append(sd);
- sb.append(dd);
- dd.click(function(){
- sb.empty();
- $('<a href="' + v.url + '" download="' + vtitle + ' video.mp4"></a>')[0].click();
- $('<a href="' + a.url + '" download="' + vtitle + ' audio.mp4"></a>')[0].click();
- begin();
- });
- sd.click(function(){
- var showdownloads = function(vlink, alink){
- sb.empty();
- sb.append("<span style='font-size: 1.75em; margin: 0 0 0 10px' class='text'>Download</span>");
- var sv = $('<div class="btn-dm"><span class="text">Save video</span></div>');
- var sa = $('<div class="btn-dm"><span class="text">Save audio</span></div>');
- sb.append(sv);
- sb.append(sa);
- sv.click(function(){
- $('<a href="' + vlink + '" download="' + vtitle + ' video.mp4"></a>')[0].click();
- });
- sa.click(function(){
- $('<a href="' + alink + '" download="' + vtitle + ' audio.mp4"></a>')[0].click();
- });
- };
- var viurl = URL.createObjectURL(new Blob([new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 40, 0, 0, 0, 40, 8, 6, 0, 0, 0, 140, 254, 184, 109, 0, 0, 3, 137, 73, 68, 65, 84, 88, 133, 237, 152, 61, 111, 211, 64, 24, 199, 255, 78, 243, 218, 166, 201, 81, 72, 72, 133, 68, 225, 11, 132, 108, 128, 84, 104, 75, 195, 192, 214, 124, 128, 34, 54, 134, 150, 129, 79, 0, 18, 91, 25, 186, 208, 133, 84, 66, 74, 73, 190, 3, 83, 164, 46, 176, 245, 133, 157, 166, 3, 82, 88, 104, 80, 36, 154, 150, 248, 30, 134, 179, 99, 59, 245, 93, 108, 39, 233, 212, 191, 114, 241, 249, 46, 207, 221, 207, 207, 115, 111, 14, 112, 165, 225, 164, 201, 42, 106, 181, 26, 17, 17, 136, 8, 0, 32, 242, 0, 32, 202, 68, 86, 148, 17, 72, 228, 37, 101, 36, 10, 48, 17, 158, 104, 181, 59, 157, 165, 215, 107, 107, 251, 67, 147, 87, 171, 85, 210, 117, 93, 154, 186, 246, 212, 53, 82, 47, 223, 181, 93, 187, 196, 57, 167, 90, 173, 70, 71, 141, 6, 149, 203, 219, 39, 155, 155, 155, 5, 175, 28, 33, 89, 133, 233, 57, 206, 57, 56, 231, 208, 205, 164, 155, 73, 55, 146, 61, 175, 163, 107, 187, 154, 137, 115, 14, 0, 184, 62, 51, 131, 98, 113, 153, 77, 78, 37, 235, 94, 33, 165, 128, 66, 210, 17, 224, 81, 78, 123, 77, 211, 192, 24, 195, 242, 147, 37, 150, 152, 156, 244, 4, 57, 192, 131, 212, 87, 232, 23, 208, 105, 160, 235, 58, 136, 8, 233, 116, 26, 75, 139, 139, 44, 22, 75, 212, 55, 6, 64, 42, 0, 253, 115, 153, 54, 36, 49, 208, 141, 112, 19, 17, 82, 169, 20, 22, 22, 30, 177, 100, 44, 86, 223, 216, 144, 67, 42, 66, 76, 78, 56, 186, 88, 231, 87, 246, 177, 202, 57, 71, 42, 149, 194, 252, 252, 60, 155, 74, 198, 234, 50, 155, 176, 20, 175, 231, 14, 151, 186, 94, 78, 179, 220, 165, 137, 10, 77, 129, 95, 169, 84, 220, 33, 34, 17, 230, 31, 80, 90, 62, 200, 123, 4, 104, 154, 227, 182, 219, 213, 177, 92, 44, 130, 115, 178, 10, 197, 7, 145, 112, 24, 159, 171, 85, 105, 107, 82, 192, 139, 3, 169, 31, 205, 233, 61, 199, 248, 211, 68, 4, 190, 255, 58, 71, 101, 175, 141, 195, 230, 57, 118, 27, 167, 120, 124, 39, 129, 47, 47, 102, 47, 0, 170, 134, 140, 34, 196, 194, 204, 221, 99, 154, 227, 1, 136, 128, 227, 86, 23, 31, 190, 182, 112, 96, 192, 172, 22, 166, 81, 46, 101, 240, 167, 195, 177, 219, 56, 5, 128, 222, 21, 125, 72, 178, 73, 165, 6, 148, 129, 1, 56, 62, 249, 135, 119, 245, 223, 56, 108, 158, 227, 160, 121, 134, 213, 194, 52, 182, 75, 89, 180, 108, 48, 59, 251, 109, 0, 64, 121, 37, 227, 184, 63, 108, 158, 33, 127, 51, 234, 236, 75, 65, 232, 33, 196, 2, 106, 247, 232, 20, 79, 63, 253, 236, 193, 64, 3, 14, 154, 103, 78, 152, 82, 214, 113, 191, 179, 223, 70, 58, 30, 194, 199, 149, 12, 242, 185, 40, 210, 241, 16, 230, 152, 91, 151, 65, 66, 108, 126, 25, 160, 249, 92, 212, 234, 92, 3, 202, 43, 89, 128, 46, 194, 148, 75, 25, 228, 103, 163, 96, 177, 16, 242, 185, 88, 207, 110, 253, 65, 26, 246, 177, 231, 234, 11, 63, 128, 253, 86, 44, 17, 2, 139, 135, 208, 234, 112, 236, 236, 181, 193, 98, 33, 108, 151, 178, 184, 151, 139, 98, 238, 90, 4, 249, 92, 20, 183, 211, 162, 185, 87, 247, 211, 214, 67, 122, 144, 106, 101, 80, 78, 18, 104, 176, 230, 3, 1, 239, 159, 221, 192, 28, 11, 227, 14, 11, 99, 142, 133, 65, 68, 88, 127, 200, 140, 223, 147, 88, 93, 164, 203, 167, 187, 247, 6, 61, 137, 122, 146, 144, 115, 29, 126, 94, 72, 90, 203, 9, 52, 219, 89, 96, 16, 156, 90, 67, 76, 18, 139, 144, 0, 196, 223, 254, 240, 217, 181, 187, 254, 190, 185, 107, 239, 40, 96, 136, 1, 0, 154, 115, 87, 24, 131, 122, 147, 81, 162, 1, 123, 177, 203, 145, 107, 148, 234, 69, 71, 222, 135, 252, 52, 51, 70, 46, 209, 190, 133, 53, 220, 78, 50, 38, 80, 231, 233, 45, 208, 50, 99, 219, 107, 71, 65, 36, 105, 91, 180, 31, 48, 196, 99, 30, 129, 142, 190, 100, 146, 31, 249, 47, 7, 77, 244, 165, 8, 177, 167, 119, 146, 113, 75, 213, 149, 124, 161, 182, 230, 216, 224, 86, 134, 85, 48, 15, 90, 91, 157, 121, 120, 53, 79, 38, 195, 200, 173, 141, 96, 30, 116, 177, 250, 246, 242, 150, 55, 10, 242, 55, 130, 3, 237, 197, 129, 38, 137, 79, 48, 187, 157, 76, 234, 227, 150, 183, 214, 229, 199, 40, 239, 45, 72, 229, 97, 146, 184, 3, 13, 106, 216, 143, 130, 133, 216, 60, 102, 4, 13, 219, 136, 164, 92, 168, 47, 107, 39, 25, 234, 173, 46, 18, 81, 140, 130, 17, 41, 112, 136, 183, 182, 182, 140, 117, 208, 120, 133, 39, 251, 171, 0, 89, 121, 163, 14, 246, 50, 251, 95, 194, 38, 132, 61, 111, 92, 85, 112, 87, 26, 133, 254, 3, 198, 161, 121, 127, 147, 119, 86, 135, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130])], {type: "image/png"}));
- var aiurl = URL.createObjectURL(new Blob([new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 40, 0, 0, 0, 40, 8, 6, 0, 0, 0, 140, 254, 184, 109, 0, 0, 5, 43, 73, 68, 65, 84, 88, 133, 237, 88, 61, 80, 27, 71, 20, 254, 78, 22, 72, 2, 161, 59, 126, 156, 17, 73, 33, 220, 37, 13, 86, 21, 40, 16, 136, 192, 128, 93, 36, 227, 52, 169, 66, 76, 19, 82, 136, 38, 51, 33, 141, 153, 73, 10, 210, 128, 103, 40, 128, 73, 198, 100, 226, 132, 191, 73, 137, 147, 34, 144, 6, 6, 10, 203, 157, 76, 229, 202, 22, 147, 12, 33, 131, 9, 39, 32, 209, 133, 232, 118, 83, 236, 253, 235, 246, 36, 29, 148, 126, 227, 101, 151, 183, 126, 251, 190, 253, 222, 190, 183, 123, 0, 175, 228, 114, 34, 240, 38, 214, 214, 214, 40, 165, 20, 148, 82, 0, 0, 27, 3, 0, 211, 177, 33, 211, 81, 80, 54, 230, 232, 40, 83, 224, 90, 240, 154, 124, 166, 40, 253, 159, 102, 50, 185, 75, 35, 95, 93, 93, 165, 170, 170, 114, 91, 201, 218, 74, 90, 51, 198, 37, 75, 95, 162, 132, 16, 186, 182, 182, 70, 95, 228, 243, 116, 113, 241, 219, 147, 217, 217, 217, 100, 181, 56, 2, 188, 9, 157, 57, 66, 8, 8, 33, 80, 245, 166, 234, 77, 213, 154, 117, 172, 162, 100, 233, 245, 70, 8, 1, 0, 180, 182, 180, 96, 112, 112, 64, 106, 104, 140, 110, 85, 11, 146, 11, 144, 9, 247, 4, 84, 41, 118, 123, 65, 16, 32, 73, 18, 6, 222, 233, 151, 34, 13, 13, 85, 129, 172, 192, 32, 117, 40, 107, 5, 104, 55, 80, 85, 21, 148, 82, 136, 162, 136, 254, 116, 90, 10, 133, 34, 91, 211, 21, 64, 122, 0, 172, 29, 151, 110, 67, 57, 6, 170, 22, 110, 74, 41, 98, 177, 24, 250, 250, 82, 82, 52, 20, 218, 154, 158, 230, 131, 244, 8, 49, 181, 131, 163, 229, 115, 181, 138, 245, 172, 18, 66, 16, 139, 197, 208, 211, 211, 35, 53, 70, 67, 91, 60, 155, 32, 23, 158, 65, 135, 203, 156, 49, 18, 76, 186, 4, 54, 33, 120, 192, 95, 90, 90, 114, 7, 81, 87, 39, 213, 14, 144, 171, 175, 196, 30, 5, 4, 193, 246, 107, 169, 164, 98, 96, 112, 16, 132, 80, 83, 201, 254, 161, 46, 24, 196, 202, 234, 42, 119, 53, 46, 192, 242, 131, 228, 132, 38, 96, 255, 228, 63, 204, 61, 150, 177, 147, 87, 240, 244, 240, 95, 219, 108, 103, 188, 30, 125, 29, 17, 140, 119, 139, 72, 72, 65, 196, 98, 162, 125, 19, 22, 128, 94, 71, 198, 35, 196, 204, 204, 141, 49, 89, 161, 152, 218, 58, 198, 220, 99, 153, 187, 240, 222, 225, 5, 246, 14, 47, 48, 151, 45, 96, 50, 221, 140, 123, 233, 102, 199, 118, 237, 190, 106, 7, 232, 186, 43, 1, 178, 162, 98, 232, 187, 3, 131, 49, 41, 28, 192, 72, 178, 9, 189, 55, 34, 16, 67, 1, 64, 0, 228, 34, 193, 110, 190, 136, 165, 220, 25, 110, 198, 67, 248, 48, 217, 100, 135, 230, 172, 94, 30, 8, 171, 8, 177, 121, 158, 228, 162, 138, 161, 135, 38, 184, 145, 100, 19, 238, 223, 110, 131, 20, 14, 48, 39, 198, 217, 163, 120, 239, 173, 6, 220, 75, 55, 67, 12, 179, 66, 81, 80, 8, 166, 182, 79, 48, 153, 150, 216, 70, 28, 116, 212, 12, 144, 234, 63, 44, 187, 155, 218, 250, 203, 0, 183, 248, 254, 107, 24, 73, 54, 177, 172, 117, 128, 211, 59, 41, 28, 0, 5, 240, 243, 179, 191, 241, 241, 250, 17, 10, 10, 1, 64, 49, 61, 220, 234, 206, 133, 139, 240, 235, 160, 195, 106, 95, 46, 97, 46, 91, 0, 192, 152, 115, 3, 231, 44, 77, 20, 192, 87, 219, 39, 248, 224, 199, 63, 53, 112, 192, 124, 246, 20, 251, 114, 201, 65, 6, 31, 161, 247, 77, 34, 176, 70, 1, 204, 101, 89, 66, 72, 225, 0, 238, 223, 110, 131, 160, 61, 187, 32, 8, 216, 201, 23, 241, 246, 215, 191, 33, 242, 229, 115, 132, 191, 120, 142, 174, 111, 126, 199, 78, 94, 1, 192, 178, 89, 239, 245, 112, 47, 60, 41, 56, 156, 113, 241, 121, 0, 212, 75, 129, 102, 188, 243, 130, 57, 28, 73, 54, 65, 12, 9, 160, 16, 12, 112, 67, 15, 15, 176, 119, 120, 97, 216, 62, 61, 188, 192, 208, 247, 7, 216, 201, 43, 120, 247, 205, 70, 60, 184, 115, 29, 191, 142, 182, 99, 36, 25, 101, 107, 105, 224, 77, 50, 124, 48, 8, 253, 177, 64, 89, 211, 207, 94, 239, 141, 136, 45, 164, 159, 253, 242, 18, 0, 99, 118, 50, 221, 140, 73, 75, 98, 76, 108, 188, 212, 54, 21, 133, 24, 10, 32, 149, 136, 0, 128, 109, 51, 140, 10, 191, 73, 162, 177, 100, 21, 150, 129, 218, 172, 96, 58, 27, 239, 22, 109, 181, 110, 106, 251, 68, 155, 51, 139, 178, 20, 46, 231, 195, 72, 198, 154, 1, 26, 207, 45, 135, 181, 21, 111, 53, 111, 134, 242, 178, 103, 117, 162, 253, 23, 95, 117, 208, 93, 45, 23, 85, 219, 92, 103, 188, 222, 184, 49, 116, 209, 199, 157, 241, 122, 219, 50, 178, 150, 201, 58, 56, 106, 14, 185, 226, 157, 36, 58, 80, 10, 220, 212, 178, 81, 63, 224, 58, 183, 51, 183, 218, 0, 152, 133, 120, 106, 251, 196, 40, 41, 51, 142, 122, 183, 187, 95, 116, 5, 238, 133, 176, 226, 55, 137, 14, 38, 213, 193, 14, 248, 114, 238, 204, 198, 68, 111, 71, 24, 155, 163, 175, 163, 183, 35, 108, 215, 221, 109, 71, 202, 162, 43, 40, 4, 203, 185, 115, 0, 64, 42, 97, 234, 217, 250, 62, 67, 108, 61, 129, 227, 221, 34, 230, 179, 5, 20, 20, 130, 137, 141, 99, 60, 184, 115, 221, 2, 40, 132, 222, 209, 118, 91, 129, 118, 202, 196, 230, 177, 193, 108, 166, 43, 86, 230, 139, 39, 149, 67, 172, 73, 66, 10, 98, 188, 155, 61, 153, 150, 115, 103, 88, 206, 157, 193, 216, 130, 189, 43, 147, 149, 220, 57, 86, 52, 246, 50, 93, 49, 36, 36, 59, 47, 190, 234, 160, 155, 205, 204, 173, 22, 227, 102, 24, 91, 63, 194, 216, 250, 17, 228, 34, 225, 2, 43, 40, 4, 99, 143, 142, 48, 246, 232, 8, 0, 59, 123, 211, 195, 45, 229, 190, 184, 240, 188, 66, 108, 230, 152, 173, 219, 188, 219, 142, 225, 31, 254, 192, 222, 225, 5, 150, 115, 231, 248, 233, 217, 63, 24, 73, 70, 145, 74, 68, 140, 58, 39, 43, 4, 187, 251, 69, 44, 231, 206, 141, 176, 118, 198, 235, 177, 241, 81, 156, 227, 202, 215, 131, 213, 126, 213, 233, 34, 134, 3, 200, 126, 242, 6, 62, 223, 60, 198, 124, 246, 20, 5, 133, 96, 62, 123, 138, 249, 236, 41, 215, 73, 166, 43, 230, 202, 156, 225, 139, 59, 227, 163, 14, 234, 50, 61, 220, 138, 76, 151, 136, 133, 39, 5, 236, 228, 21, 199, 245, 197, 24, 75, 37, 194, 174, 103, 174, 204, 149, 47, 6, 171, 184, 38, 18, 82, 208, 254, 182, 163, 213, 88, 185, 57, 243, 249, 77, 82, 229, 234, 222, 215, 89, 117, 43, 112, 165, 138, 36, 113, 7, 84, 105, 225, 90, 196, 95, 136, 245, 103, 134, 223, 176, 93, 145, 120, 22, 106, 94, 125, 187, 106, 185, 212, 87, 93, 93, 157, 119, 6, 94, 133, 248, 14, 241, 194, 194, 130, 246, 160, 214, 62, 225, 169, 245, 83, 128, 154, 99, 109, 14, 86, 157, 245, 79, 194, 58, 8, 235, 88, 235, 189, 192, 189, 146, 171, 144, 255, 1, 137, 115, 67, 107, 165, 227, 116, 77, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130])], {type: "image/png"}));
- sidebar.back(function(){
- arr.cancel();
- clearInterval(i);
- downopt(v, a);
- });
- sb.empty();
- var create = function(title, url, iurl){
- var el = $("<div class='downitem'></div>");
- var dt = $("<span style='color: rgb(51, 103, 214); display: block; font-size: 1rem; font-weight: 500'>" + title + "</span>");
- var dl = $("<a href='" + url + "' target='_blank' style='color: #777; text-overflow: ellipsis; overflow: hidden; text-decoration: none; white-space: nowrap; display: block'>" + url + "</a>");
- var descript = $("<span style='color: #616161; margin-top: 12px; font-size: 1rem; display: block; text-overflow: ellipsis; overflow: hidden; text-decoration: none; white-space: nowrap;'>0 B/s - 0 KB</span>");
- var progo = $("<div class='progress' style='background-color: #eee; max-width: 100%; margin-top: 4px'></div>");
- var prog = $("<div class='progress'></div>");
- var odc = $("<div style='height: 100%; width: 85%; display: inline-block; overflow: hidden'></div>");
- var cd = $("<div style='height: 95%; width: 95%; margin: 1.25% 0 0 2%'></div>");
- odc.append(cd);
- progo.append(prog);
- var mi = $("<div style='width: 15%; height: 100%; display: inline-block; overflow: hidden'><div style='border-right: 1px solid #d0d0d0; height: 100%'><div style='display: inline-block; padding: 18%'><img style='width: 100%' src='" + iurl + "'></div></div></div>");
- el.append(mi);
- el.append(odc);
- cd.append(dt);
- cd.append(dl);
- cd.append(descript);
- cd.append(progo);
- return {element: el, des: descript, prog: prog, done: function(){
- progo.remove();
- descript.remove();
- el.css("height", "70px");
- }};
- };
- var vi = create("video", v.url, viurl);
- var ai = create("audio", a.url, aiurl);
- sb.append(vi.element);
- sb.append(ai.element);
- var start = new Date().getTime();
- var vspeed = 0, vtime = 0, vprog = 0, vbd = 0, aspeed = 0, atime = 0, aprog = 0, abd = 0;
- var vb = 0, vt = 0, ab = 0, at = 0, ovb = 0, oab = 0;
- var vdone, adone, vpause, apause, downloadable = true, maxmb = 800, cm = 5;
- var arr = download(v, a, maxmb, cm, function(attr, arg0, arg1){
- if(attr === "vprog"){
- vb = arg0;
- vt = arg1;
- }if(attr === "aprog"){
- ab = arg0;
- at = arg1;
- }if(attr === "vdone"){
- vi.done();
- vdone = true;
- if(adone){
- clearInterval(i);
- if(downloadable)
- showdownloads(URL.createObjectURL(new Blob(arr.videoArray, {type: v.mime})), URL.createObjectURL(new Blob(arr.audioArray, {type: a.mime})));
- }
- }if(attr === "adone"){
- ai.done();
- adone = true;
- if(vdone){
- clearInterval(i);
- if(downloadable)
- showdownloads(URL.createObjectURL(new Blob(arr.videoArray, {type: v.mime})), URL.createObjectURL(new Blob(arr.audioArray, {type: a.mime})));
- }
- }if(attr === "undownloadable")
- downloadable = false;
- if(attr === "vpause")
- vpause = arg0;
- if(attr === "apause")
- apause = arg0;
- });
- var i = setInterval(function(){
- vprog = Math.round(vb * 10000 / vt) / 100 + "%";
- aprog = Math.round(ab * 10000 / at) / 100 + "%";
- vbd = shorten(vb) + " of " + shorten(vt);
- abd = shorten(ab) + " of " + shorten(at);
- var vc = vb - ovb, ac = ab - oab;
- ovb = vb;
- oab = ab;
- vspeed = shorten(vc) + "/s";
- aspeed = shorten(ac) + "/s";
- var tel = new Date().getTime() - start;
- var vsec = Math.round((vt - vb) / (vb / (tel / 1000))), asec = Math.round((at - ab) / (ab / (tel / 1000)));
- vtime = vpause ? " Paused" : time(vsec) + " left";
- atime = apause ? " Paused" : time(asec) + " left";
- vi.prog.css("max-width", vprog);
- vi.des[0].innerText = vspeed + " - " + vbd + ", " + vtime;
- ai.prog.css("max-width", aprog);
- ai.des[0].innerText = aspeed + " - " + abd + ", " + atime;
- }, 1000);
- var shorten = function(bytes){
- var pbm = ["", "K", "M", "G", "T", "P", "E", "Z", "Y"];
- var s = Math.floor((bytes.toString().length - 1) / 3);
- return Math.round(bytes * 10 / Math.pow(1000, s)) / 10 + pbm[s] + "B";
- };
- var time = function(seconds){
- var min = Math.floor(seconds / 60);
- var hr = Math.floor(min / 60);
- var day = Math.floor(hr / 24);
- seconds %= 60;
- var str = "";
- var a = 0;
- if(day > 0){
- str += day + " day" + (day > 1 ? "s " : " ");
- a++;
- }if(hr > 0){
- str += hr + " hour" + (hr > 1 ? "s " : " ");
- a++;
- }if(min > 0 && a < 2){
- str += min + " min" + (min > 1 ? "s " : " ");
- a++;
- }if(a < 2){
- str += seconds + " sec" + (seconds > 1 ? "s" : "");
- }
- return str;
- };
- });
- if(ad){
- ad = false;
- if(dopt == "sd")
- sd[0].click();
- if(dopt == "dd")
- dd[0].click();
- dopt = null;
- }
- }
- function download(video, audio, maxmb, cm, cb){
- var media = new MediaSource();
- var vbuf, abuf;
- var svc = function(){
- var i = setVideoSrc(URL.createObjectURL(media), function(ct){
- debug(media.readyState, vbuf, abuf, vac, aac, vad, aad);
- if(media.readyState == "closed" || !vbuf || !abuf)
- return;
- if(!vbuf.updating && !abuf.updating && vac && aac && media.readyState == "open")
- media.endOfStream();
- if((vbuf.buffered.length === 0 || vbuf.buffered.end(0)) - ct < 10 && vad[vac] && !vbuf.updating)
- vbuf.appendBuffer(vad[vac++]);
- if(vbuf.buffered.length > 0 && (abuf.buffered.length === 0 || abuf.buffered.end(0) - vbuf.buffered.end(0) < 0) && aad[aac] && !abuf.updating)
- abuf.appendBuffer(aad[aac++]);
- checkPause();
- });
- return function(){
- clearInterval(i);
- };
- };
- var cvc = svc();
- media.addEventListener("sourceopen", function(){
- debug("sourceopen", media.sourceBuffers.length);
- if(media.sourceBuffers.length > 0)
- return;
- vbuf = media.addSourceBuffer(video.mime);
- abuf = media.addSourceBuffer(audio.mime);
- });
- media.addEventListener("sourceclose", sc);
- var sc = function(){
- debug("sourceclose");
- return;
- cvc();
- media = new MediaSource();
- media.addEventListener("sourceopen", function(){
- if(media.sourceBuffers.length > 0)
- return;
- vbuf = media.addSourceBuffer(video.mime);
- abuf = media.addSourceBuffer(audio.mime);
- vac = 0;
- aac = 0;
- });
- media.addEventListener("sourceclose", sc);
- cvc = svc();
- };
- var vad = [], aad = [], vac = 0, aac = 0;
- var vcf = chunkDownload(video.url, video.length, video.length / 1000000 / cm, function(loaded, total){
- cb("vprog", loaded, total);
- }, function(data){
- vad.push(data);
- checkPause();
- }, function(){
- cb("vdone");
- }, function(){
- acf.abort();
- begin();
- });
- var acf = chunkDownload(audio.url, audio.length, audio.length / 10000 / cm, function(loaded, total){
- cb("aprog", loaded, total);
- }, function(data){
- aad.push(data);
- checkPause();
- }, function(){
- cb("adone");
- }, function(){
- vcf.abort();
- });
- var checkPause = function(){
- if((vac || aac) && (vad.length + aad.length / 100) * cm >= maxmb){
- vad.splice(0, vac);
- vac = 0;
- aad.splice(0, aac);
- aac = 0;
- cb("undownloadable");
- }if((vad.length + aad.length / 100) * cm >= maxmb){
- vcf.pause();
- acf.pause();
- cb("vpause", true);
- cb("apause", true);
- }if((vad.length + aad.length / 100) * cm < maxmb){
- vcf.resume();
- acf.resume();
- cb("vpause", false);
- cb("apause", false);
- }
- };
- return {videoArray: vad, audioArray: aad, cancel: function(){
- vcf.abort();
- acf.abort();
- cvc();
- }};
- }
- function chunkDownload(link, size, chunks, pcb, ccb, dcb, ecb){
- var ri = Math.ceil(size / chunks), sr = 0, er = ri > size ? size : ri;
- var pause = false;
- var x = new XMLHttpRequest();
- x.open("GET", link + "&range=" + sr + "-" + er);
- x.responseType = "arraybuffer";
- x.onprogress = function(e){
- if(e.lengthComputable){
- pcb(sr + e.loaded, size);
- }
- };
- x.onreadystatechange = function(){
- if(this.readyState == 4)
- if(this.status == 200){
- ccb(new Uint8Array(this.response));
- if(er < size){
- sr += ri + 1;
- er += ri + 1;
- if(er > size)
- er = size;
- if(pause)
- return;
- x.open("GET", link + "&range=" + sr + "-" + er);
- x.send();
- }else
- dcb();
- }else
- ecb();
- };
- x.send();
- return {abort: function(){
- x.abort();
- }, pause: function(){
- pause = true;
- }, resume: function(){
- if(!pause)
- return;
- pause = false;
- if(x.readyState == 4){
- x.open("GET", link + "&range=" + sr + "-" + er);
- x.send();
- }
- }};
- }
- function setVideoSrc(video, cb){
- var vid = $("video");
- vid.attr("src", video);
- var i = setInterval(function(){
- if(vid.attr("src") !== video)// && document.getElementsByClassName("ad-interrupting").length === 0)
- vid.attr("src", video);
- cb(vid[0].currentTime);
- }, 600);
- return i;
- }
- function debug(){
- if(typeof showdebug !== "undefined" && showdebug)
- console.log(arguments);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement