Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 31.97 KB | None | 0 0
  1. // ==UserScript==
  2. // @name YT Downloader +8K
  3. // @namespace http://tampermonkey.net/
  4. // @version 3.0
  5. // @description try to take over the world!
  6. // @author You
  7. // @match https://www.youtube.com/*
  8. // @include file:///*
  9. // @grant none
  10. // @require https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
  11. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js
  12. // ==/UserScript==
  13.  
  14. var $, c;
  15. var vtitle;
  16. var sidebar;
  17. var ad, dqt, dfps, dopt;
  18.  
  19. (function(){
  20. c = this.jQuery = jQuery.noConflict(false);
  21. $ = this.jQuery = jQuery.noConflict(false);
  22.  
  23. var start = function(){
  24. if(!window.location.href.includes("watch?v=") || $(".btn-small")[0])
  25. return;
  26. var vsch = $(".title.style-scope.ytd-video-primary-info-renderer");
  27.  
  28. if(vsch[0] == null){
  29. setTimeout(function(){
  30. start();
  31. }, 1000);
  32.  
  33. return;
  34. }
  35.  
  36. vsch.css("display", "inline-block");
  37.  
  38. vtitle = vsch[0].innerText;
  39.  
  40. 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>");
  41.  
  42. $("#offer-module").prepend(sb);
  43.  
  44. $("<style>@import url('https://fonts.googleapis.com/css?family=Roboto');" +
  45. ".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}" +
  46. ".progress{max-width: 0%; width: 100%; height: 4px; transition: max-width 0.3s ease-out, opacity 0.3s ease-out; background-color: #09f}" +
  47. ".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}" +
  48. ".btn-dm:hover{background-color: #ddd}" +
  49. ".text{font-size: 1.25rem; font-family: 'Roboto', sans-serif; margin: 0; letter-spacing; 0.5px}" +
  50. ".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);
  51.  
  52. var load = $("<div class='progress' style='position: relative; overflow: visible'></div>");
  53.  
  54. load.append("<div style='width: 30px; height: 100%; position: absolute; right: 0; box-shadow: 0 0 5px #09f'></div>");
  55. sb.append(load);
  56.  
  57. var sbi = $("<div style='width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0); overflow-x: hidden; margin-top: 32px'></div>");
  58. var te = $("<div style='width: 100%; height: 32px; position: absolute; top: 0'></div>");
  59. 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>');
  60.  
  61. te.append(back);
  62.  
  63. sb.append(sbi);
  64. sb.append(te);
  65.  
  66. sidebar = {show: function(){
  67. sb.css("max-height", "300px");
  68. sb.css("margin-bottom", "10px");
  69. }, loading: function(l){
  70. if(!l){
  71. load.css("transition", "max-width 0s linear");
  72. load.css("max-width", "0%");
  73.  
  74. setTimeout(function(){
  75. load.css("transition", "");
  76. }, 0);
  77. }
  78.  
  79. load.css("opacity", l == 100 ? 0 : 1);
  80. load.css("max-width", l + "%");
  81. }, back: function(f){
  82. if(f !== null){
  83. back.css("opacity", 1);
  84. back.unbind("click");
  85. back.on("click", f);
  86. }else
  87. back.css("opacity", 0);
  88. }, element: sbi};
  89.  
  90. if(window.location.href.includes("&d=t")){
  91. var args = window.location.href.split("&");
  92.  
  93. for(var i in args){
  94. if(args[i].startsWith("dqt")){
  95. ad = true;
  96. dqt = args[i].substring(4);
  97. }if(args[i].startsWith("dfps")){
  98. ad = true;
  99. dfps = args[i].substring(5);
  100. }if(args[i].startsWith("dopt"))
  101. dopt = args[i].substring(5);
  102. }
  103.  
  104. begin();
  105.  
  106. return;
  107. }
  108.  
  109. var down = $('<span class="btn-small">Download</span>');
  110. vsch.append(down);
  111. down.click(function(){
  112. down.remove();
  113.  
  114. begin();
  115. });
  116. };
  117.  
  118. $(document).ready(function(){
  119. setTimeout(start, 1000);
  120. });
  121.  
  122. window.onpopstate = function(){
  123. setTimeout(start, 1000);
  124. };
  125.  
  126. (function(push){
  127. window.history.pushState = function(){
  128. setTimeout(start, 1000);
  129.  
  130. push.apply(this, arguments);
  131. };
  132. })(window.history.pushState);
  133. })();
  134.  
  135. function begin(){
  136. sidebar.show();
  137. sidebar.loading(0);
  138.  
  139. var dcb = function(st){
  140. var as = [];
  141.  
  142. sidebar.back(function(){
  143. begin();
  144. });
  145.  
  146. var sb = sidebar.element;
  147.  
  148. sb.empty();
  149.  
  150. sb.append("<span style='font-size: 1.75em; margin: 0 0 0 10px' class='text'>Download</span>");
  151.  
  152. var adl;
  153.  
  154. parseURLs(st, function(p){
  155. //sidebar.loading(p);
  156. }, function(l){
  157. if(l.mime.startsWith("video")){
  158. 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>');
  159.  
  160. btn.click(function(){
  161. if(as.length && MediaSource.isTypeSupported(l.mime) && MediaSource.isTypeSupported(as[0].mime))
  162. downopt(l, as[0]);
  163. });
  164.  
  165. sb.append(btn);
  166.  
  167. if(!adl && ad && (dqt || dfps) && (!dqt || l.quality == dqt) && (!dfps || l.fps == dfps))
  168. adl = l;
  169. }if(l.mime.startsWith("audio"))
  170. as.push(l);
  171. }, function(){
  172. dfps = null;
  173. dqt = null;
  174.  
  175. if(adl && as.length && MediaSource.isTypeSupported(adl.mime) && MediaSource.isTypeSupported(as[0].mime))
  176. downopt(adl, as[0]);
  177. });
  178.  
  179. //sidebar.loading(0);
  180. };
  181.  
  182. getDownloadURLs(function(p){
  183. sidebar.loading(p);
  184. }, dcb);
  185. }
  186.  
  187. var urlcache;
  188.  
  189. function getDownloadURLs(pcb, r){
  190. var scripts = $("script");
  191.  
  192. if(urlcache)
  193. r(urlcache);
  194. else
  195. for(var i in scripts)
  196. if(scripts[i].innerText != null && scripts[i].innerText.includes("ytplayer") && scripts[i].innerText.includes("adaptive_fmts"))
  197. r(urlcache = scripts[i].innerText);
  198. var x = new XMLHttpRequest();
  199.  
  200. x.open("GET", window.location.href);
  201. x.onprogress = function(e){
  202. if(e.lengthComputable)
  203. pcb((this.readyState + e.loaded / e.total) * 25);
  204. };
  205.  
  206. x.onreadystatechange = function(){
  207. pcb(this.readyState * 25);
  208.  
  209. if(this.readyState == 4)
  210. if(this.status == 200){
  211. var scripts = $(this.responseText).find("script");
  212.  
  213. for(var i in scripts)
  214. if(scripts[i].innerText != null && scripts[i].innerText.includes("ytplayer") && scripts[i].innerText.includes("adaptive_fmts")){
  215. urlcache = scripts[i].innerText;
  216.  
  217. return;
  218. }
  219.  
  220. x.open("GET", window.location.href);
  221. x.send();
  222. }else{
  223. x.open("GET", window.location.href);
  224. x.send();
  225. }
  226. };
  227.  
  228. x.send();
  229. }
  230.  
  231. function parseURLs(st, pcb, lcb, dcb){
  232. var linksraw = st.substring(st.indexOf("adaptive_fmts") + 16, st.indexOf("\"", st.indexOf("adaptive_fmts") + 16)).split(/,/);
  233.  
  234. for(var i in linksraw){
  235. var params = linksraw[i].split("\\u0026");
  236.  
  237. var url, type, quality, fps, length;
  238.  
  239. for(var j in params){
  240. pcb(100 * (i + j / params.length) / linksraw.length);
  241.  
  242. if(params[j].startsWith("url"))
  243. url = params[j].substring(4);
  244. else if(params[j].startsWith("type"))
  245. type = params[j].substring(5);
  246. else if(params[j].startsWith("size"))
  247. quality = params[j].substring(5);
  248. else if(params[j].startsWith("fps"))
  249. fps = params[j].substring(4);
  250. else if(params[j].startsWith("clen"))
  251. length = params[j].substring(5);
  252. }
  253.  
  254. lcb({url: decodeURI(decodeURIComponent(url)), mime: decodeURIComponent(type), length: length, quality: quality, fps: fps});
  255. }
  256.  
  257. dcb();
  258. }
  259.  
  260. function downopt(v, a){
  261. sidebar.back(function(){
  262. begin();
  263. });
  264.  
  265. var sb = sidebar.element;
  266.  
  267. sb.empty();
  268.  
  269. var sd = $('<div class="btn-dm"><span class="text">Stream to device and save files</span></div>');
  270. var dd = $('<div class="btn-dm"><span class="text">Direct download</span></div>');
  271.  
  272. sb.append("<span style='font-size: 1.75em; margin: 0 0 0 10px' class='text'>Method</span>");
  273.  
  274. sb.append(sd);
  275. sb.append(dd);
  276.  
  277. dd.click(function(){
  278. sb.empty();
  279.  
  280. $('<a href="' + v.url + '" download="' + vtitle + ' video.mp4"></a>')[0].click();
  281. $('<a href="' + a.url + '" download="' + vtitle + ' audio.mp4"></a>')[0].click();
  282.  
  283. begin();
  284. });
  285.  
  286. sd.click(function(){
  287. var showdownloads = function(vlink, alink){
  288. sb.empty();
  289.  
  290. sb.append("<span style='font-size: 1.75em; margin: 0 0 0 10px' class='text'>Download</span>");
  291.  
  292. var sv = $('<div class="btn-dm"><span class="text">Save video</span></div>');
  293. var sa = $('<div class="btn-dm"><span class="text">Save audio</span></div>');
  294.  
  295. sb.append(sv);
  296. sb.append(sa);
  297.  
  298. sv.click(function(){
  299. $('<a href="' + vlink + '" download="' + vtitle + ' video.mp4"></a>')[0].click();
  300. });
  301.  
  302. sa.click(function(){
  303. $('<a href="' + alink + '" download="' + vtitle + ' audio.mp4"></a>')[0].click();
  304. });
  305. };
  306.  
  307. 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"}));
  308. 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"}));
  309.  
  310. sidebar.back(function(){
  311. arr.cancel();
  312.  
  313. clearInterval(i);
  314.  
  315. downopt(v, a);
  316. });
  317.  
  318. sb.empty();
  319.  
  320. var create = function(title, url, iurl){
  321. var el = $("<div class='downitem'></div>");
  322.  
  323. var dt = $("<span style='color: rgb(51, 103, 214); display: block; font-size: 1rem; font-weight: 500'>" + title + "</span>");
  324. 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>");
  325. 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>");
  326. var progo = $("<div class='progress' style='background-color: #eee; max-width: 100%; margin-top: 4px'></div>");
  327. var prog = $("<div class='progress'></div>");
  328. var odc = $("<div style='height: 100%; width: 85%; display: inline-block; overflow: hidden'></div>");
  329. var cd = $("<div style='height: 95%; width: 95%; margin: 1.25% 0 0 2%'></div>");
  330.  
  331. odc.append(cd);
  332. progo.append(prog);
  333.  
  334. 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>");
  335.  
  336. el.append(mi);
  337. el.append(odc);
  338.  
  339. cd.append(dt);
  340. cd.append(dl);
  341. cd.append(descript);
  342. cd.append(progo);
  343.  
  344. return {element: el, des: descript, prog: prog, done: function(){
  345. progo.remove();
  346. descript.remove();
  347. el.css("height", "70px");
  348. }};
  349. };
  350.  
  351. var vi = create("video", v.url, viurl);
  352. var ai = create("audio", a.url, aiurl);
  353.  
  354. sb.append(vi.element);
  355. sb.append(ai.element);
  356.  
  357. var start = new Date().getTime();
  358.  
  359. var vspeed = 0, vtime = 0, vprog = 0, vbd = 0, aspeed = 0, atime = 0, aprog = 0, abd = 0;
  360. var vb = 0, vt = 0, ab = 0, at = 0, ovb = 0, oab = 0;
  361.  
  362. var vdone, adone, vpause, apause, downloadable = true, maxmb = 800, cm = 5;
  363.  
  364. var arr = download(v, a, maxmb, cm, function(attr, arg0, arg1){
  365. if(attr === "vprog"){
  366. vb = arg0;
  367. vt = arg1;
  368. }if(attr === "aprog"){
  369. ab = arg0;
  370. at = arg1;
  371. }if(attr === "vdone"){
  372. vi.done();
  373.  
  374. vdone = true;
  375.  
  376. if(adone){
  377. clearInterval(i);
  378.  
  379. if(downloadable)
  380. showdownloads(URL.createObjectURL(new Blob(arr.videoArray, {type: v.mime})), URL.createObjectURL(new Blob(arr.audioArray, {type: a.mime})));
  381. }
  382. }if(attr === "adone"){
  383. ai.done();
  384.  
  385. adone = true;
  386.  
  387. if(vdone){
  388. clearInterval(i);
  389.  
  390. if(downloadable)
  391. showdownloads(URL.createObjectURL(new Blob(arr.videoArray, {type: v.mime})), URL.createObjectURL(new Blob(arr.audioArray, {type: a.mime})));
  392. }
  393. }if(attr === "undownloadable")
  394. downloadable = false;
  395. if(attr === "vpause")
  396. vpause = arg0;
  397. if(attr === "apause")
  398. apause = arg0;
  399. });
  400.  
  401. var i = setInterval(function(){
  402. vprog = Math.round(vb * 10000 / vt) / 100 + "%";
  403. aprog = Math.round(ab * 10000 / at) / 100 + "%";
  404. vbd = shorten(vb) + " of " + shorten(vt);
  405. abd = shorten(ab) + " of " + shorten(at);
  406.  
  407. var vc = vb - ovb, ac = ab - oab;
  408. ovb = vb;
  409. oab = ab;
  410.  
  411. vspeed = shorten(vc) + "/s";
  412. aspeed = shorten(ac) + "/s";
  413.  
  414. var tel = new Date().getTime() - start;
  415.  
  416. var vsec = Math.round((vt - vb) / (vb / (tel / 1000))), asec = Math.round((at - ab) / (ab / (tel / 1000)));
  417.  
  418. vtime = vpause ? " Paused" : time(vsec) + " left";
  419. atime = apause ? " Paused" : time(asec) + " left";
  420.  
  421. vi.prog.css("max-width", vprog);
  422. vi.des[0].innerText = vspeed + " - " + vbd + ", " + vtime;
  423. ai.prog.css("max-width", aprog);
  424. ai.des[0].innerText = aspeed + " - " + abd + ", " + atime;
  425. }, 1000);
  426.  
  427. var shorten = function(bytes){
  428. var pbm = ["", "K", "M", "G", "T", "P", "E", "Z", "Y"];
  429. var s = Math.floor((bytes.toString().length - 1) / 3);
  430.  
  431. return Math.round(bytes * 10 / Math.pow(1000, s)) / 10 + pbm[s] + "B";
  432. };
  433.  
  434. var time = function(seconds){
  435. var min = Math.floor(seconds / 60);
  436. var hr = Math.floor(min / 60);
  437. var day = Math.floor(hr / 24);
  438.  
  439. seconds %= 60;
  440.  
  441. var str = "";
  442. var a = 0;
  443.  
  444. if(day > 0){
  445. str += day + " day" + (day > 1 ? "s " : " ");
  446. a++;
  447. }if(hr > 0){
  448. str += hr + " hour" + (hr > 1 ? "s " : " ");
  449. a++;
  450. }if(min > 0 && a < 2){
  451. str += min + " min" + (min > 1 ? "s " : " ");
  452. a++;
  453. }if(a < 2){
  454. str += seconds + " sec" + (seconds > 1 ? "s" : "");
  455. }
  456.  
  457. return str;
  458. };
  459. });
  460.  
  461. if(ad){
  462. ad = false;
  463.  
  464. if(dopt == "sd")
  465. sd[0].click();
  466. if(dopt == "dd")
  467. dd[0].click();
  468.  
  469. dopt = null;
  470. }
  471. }
  472.  
  473. function download(video, audio, maxmb, cm, cb){
  474. var media = new MediaSource();
  475.  
  476. var vbuf, abuf;
  477.  
  478. var svc = function(){
  479. var i = setVideoSrc(URL.createObjectURL(media), function(ct){
  480. debug(media.readyState, vbuf, abuf, vac, aac, vad, aad);
  481.  
  482. if(media.readyState == "closed" || !vbuf || !abuf)
  483. return;
  484. if(!vbuf.updating && !abuf.updating && vac && aac && media.readyState == "open")
  485. media.endOfStream();
  486. if((vbuf.buffered.length === 0 || vbuf.buffered.end(0)) - ct < 10 && vad[vac] && !vbuf.updating)
  487. vbuf.appendBuffer(vad[vac++]);
  488. if(vbuf.buffered.length > 0 && (abuf.buffered.length === 0 || abuf.buffered.end(0) - vbuf.buffered.end(0) < 0) && aad[aac] && !abuf.updating)
  489. abuf.appendBuffer(aad[aac++]);
  490. checkPause();
  491. });
  492.  
  493. return function(){
  494. clearInterval(i);
  495. };
  496. };
  497.  
  498. var cvc = svc();
  499.  
  500. media.addEventListener("sourceopen", function(){
  501. debug("sourceopen", media.sourceBuffers.length);
  502.  
  503. if(media.sourceBuffers.length > 0)
  504. return;
  505. vbuf = media.addSourceBuffer(video.mime);
  506. abuf = media.addSourceBuffer(audio.mime);
  507. });
  508.  
  509. media.addEventListener("sourceclose", sc);
  510.  
  511. var sc = function(){
  512. debug("sourceclose");
  513.  
  514. return;
  515.  
  516. cvc();
  517.  
  518. media = new MediaSource();
  519.  
  520. media.addEventListener("sourceopen", function(){
  521. if(media.sourceBuffers.length > 0)
  522. return;
  523. vbuf = media.addSourceBuffer(video.mime);
  524. abuf = media.addSourceBuffer(audio.mime);
  525.  
  526. vac = 0;
  527. aac = 0;
  528. });
  529.  
  530. media.addEventListener("sourceclose", sc);
  531.  
  532. cvc = svc();
  533. };
  534.  
  535. var vad = [], aad = [], vac = 0, aac = 0;
  536.  
  537. var vcf = chunkDownload(video.url, video.length, video.length / 1000000 / cm, function(loaded, total){
  538. cb("vprog", loaded, total);
  539. }, function(data){
  540. vad.push(data);
  541.  
  542. checkPause();
  543. }, function(){
  544. cb("vdone");
  545. }, function(){
  546. acf.abort();
  547.  
  548. begin();
  549. });
  550.  
  551. var acf = chunkDownload(audio.url, audio.length, audio.length / 10000 / cm, function(loaded, total){
  552. cb("aprog", loaded, total);
  553. }, function(data){
  554. aad.push(data);
  555.  
  556. checkPause();
  557. }, function(){
  558. cb("adone");
  559. }, function(){
  560. vcf.abort();
  561. });
  562.  
  563. var checkPause = function(){
  564. if((vac || aac) && (vad.length + aad.length / 100) * cm >= maxmb){
  565. vad.splice(0, vac);
  566. vac = 0;
  567. aad.splice(0, aac);
  568. aac = 0;
  569.  
  570. cb("undownloadable");
  571. }if((vad.length + aad.length / 100) * cm >= maxmb){
  572. vcf.pause();
  573. acf.pause();
  574.  
  575. cb("vpause", true);
  576. cb("apause", true);
  577. }if((vad.length + aad.length / 100) * cm < maxmb){
  578. vcf.resume();
  579. acf.resume();
  580.  
  581. cb("vpause", false);
  582. cb("apause", false);
  583. }
  584. };
  585.  
  586. return {videoArray: vad, audioArray: aad, cancel: function(){
  587. vcf.abort();
  588. acf.abort();
  589.  
  590. cvc();
  591. }};
  592. }
  593.  
  594. function chunkDownload(link, size, chunks, pcb, ccb, dcb, ecb){
  595. var ri = Math.ceil(size / chunks), sr = 0, er = ri > size ? size : ri;
  596. var pause = false;
  597.  
  598. var x = new XMLHttpRequest();
  599.  
  600. x.open("GET", link + "&range=" + sr + "-" + er);
  601. x.responseType = "arraybuffer";
  602. x.onprogress = function(e){
  603. if(e.lengthComputable){
  604. pcb(sr + e.loaded, size);
  605. }
  606. };
  607.  
  608. x.onreadystatechange = function(){
  609. if(this.readyState == 4)
  610. if(this.status == 200){
  611. ccb(new Uint8Array(this.response));
  612.  
  613. if(er < size){
  614. sr += ri + 1;
  615. er += ri + 1;
  616.  
  617. if(er > size)
  618. er = size;
  619. if(pause)
  620. return;
  621. x.open("GET", link + "&range=" + sr + "-" + er);
  622. x.send();
  623. }else
  624. dcb();
  625. }else
  626. ecb();
  627. };
  628.  
  629. x.send();
  630.  
  631. return {abort: function(){
  632. x.abort();
  633. }, pause: function(){
  634. pause = true;
  635. }, resume: function(){
  636. if(!pause)
  637. return;
  638. pause = false;
  639.  
  640. if(x.readyState == 4){
  641. x.open("GET", link + "&range=" + sr + "-" + er);
  642. x.send();
  643. }
  644. }};
  645. }
  646.  
  647. function setVideoSrc(video, cb){
  648. var vid = $("video");
  649.  
  650. vid.attr("src", video);
  651.  
  652. var i = setInterval(function(){
  653. if(vid.attr("src") !== video)// && document.getElementsByClassName("ad-interrupting").length === 0)
  654. vid.attr("src", video);
  655. cb(vid[0].currentTime);
  656. }, 600);
  657.  
  658. return i;
  659. }
  660.  
  661. function debug(){
  662. if(typeof showdebug !== "undefined" && showdebug)
  663. console.log(arguments);
  664. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement