Xuetangx Caption Crawler

Download Xuetangx Captions

  1. // ==UserScript==
  2. // @name Xuetangx Caption Crawler
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description Download Xuetangx Captions
  6. // @author RabbitHu
  7. // @match http://*.xuetangx.com/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11.  
  12. var close_after_download = false;
  13.  
  14. function fake_click(obj) {
  15. var ev = document.createEvent("MouseEvents");
  16. ev.initMouseEvent(
  17. "click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null
  18. );
  19. obj.dispatchEvent(ev);
  20. }
  21.  
  22. function download(name, data) {
  23. var urlObject = window.URL || window.webkitURL || window;
  24.  
  25. var downloadData = new Blob([data]);
  26.  
  27. var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
  28. save_link.href = urlObject.createObjectURL(downloadData);
  29. save_link.download = name;
  30. fake_click(save_link);
  31. }
  32.  
  33. function download_caption(){
  34. document.getElementsByClassName('xt_video_player_word_break')[0].click();
  35. var title = document.getElementsByClassName('active')[2].innerText.split('\n')[0];
  36. var caption = document.getElementsByClassName('xt_video_player_caption_aside')[0].innerText;
  37. download(title + ".txt", caption);
  38. if(close_after_download) window.close();
  39. }
  40.  
  41. function try_download_caption(){
  42. var try_download_caption_interval = setInterval(function(){
  43. if(document.getElementsByClassName('xt_video_player_word_break').length){
  44. download_caption();
  45. try_download_caption_interval = window.clearInterval(try_download_caption_interval);
  46. }
  47. console.log('try_download_caption');
  48. }, 100);
  49. }
  50.  
  51. function create_download_button(){
  52. if(!document.getElementsByClassName('wrapper-downloads')[0]) return;
  53. var li_element = document.createElement("li");
  54. var a_element = document.createElement("a");
  55. a_element.onclick = function(){
  56. try_download_caption();
  57. }
  58. a_element.setAttribute("one-link-mark","yes");
  59. li_element.setAttribute("class", "video-tracks video-download-button");
  60. a_element.innerHTML = "下载本节字幕";
  61. li_element.appendChild(a_element);
  62. document.getElementsByClassName('wrapper-downloads')[0].appendChild(li_element);
  63. }
  64.  
  65. function create_download_all_button(){
  66. if(!document.getElementsByClassName('wrapper-downloads')[0]) return;
  67. var li_element = document.createElement("li");
  68. var a_element = document.createElement("a");
  69. a_element.onclick = function(){
  70. var msg = "接下来将打开多个新标签页用于下载字幕。如果未能成功下载/只能下载一个字幕文件,请检查浏览器是否拦截了弹窗(一般会在地址栏右边有标志)。";
  71. if (confirm(msg)==true){
  72. console.log('Download All!');
  73. download_all();
  74. }
  75. }
  76. a_element.setAttribute("one-link-mark","yes");
  77. li_element.setAttribute("class", "video-tracks video-download-button");
  78. a_element.innerHTML = "下载课程全部字幕";
  79. li_element.appendChild(a_element);
  80. document.getElementsByClassName('wrapper-downloads')[0].appendChild(li_element);
  81. }
  82.  
  83. function instant_download(){
  84. console.log('Instant Download Running...');
  85. try_download_caption();
  86. //window.close();
  87. }
  88.  
  89. function download_all(){
  90. var navs = document.getElementsByTagName('nav');
  91. var course_nav = navs[0];
  92. for(var i = 0; i < navs.length; i++){
  93. if(navs[i].ariaLabel){
  94. course_nav = navs[i];
  95. }
  96. }
  97. var str = course_nav.innerHTML;
  98. console.log(str);
  99. var urls = Array.from(str.matchAll('href *= *"/(.*)/"'));
  100. var open_windows = [];
  101. var cur_url_index = 0, max_open_windows = 5;
  102. var open_window_url = setInterval(function(){
  103. for(var i = 0; i < max_open_windows; i++){
  104. if(!!open_windows[i] && open_windows[i].closed){
  105. open_windows[i] = null;
  106. }
  107. if(!open_windows[i] && cur_url_index < urls.length){
  108. open_windows[i] = window.open('http://' + window.location.href.split('/')[2] + '/' + urls[cur_url_index][1] + '?instant_download');
  109. cur_url_index++;
  110. }
  111. }
  112. if(cur_url_index >= urls.length){
  113. open_window_url = window.clearInterval(open_window_url);
  114. }
  115. }, 100);
  116. }
  117.  
  118. window.onload = function(){
  119. console.log('Xuetangx Caption Crawler Running!');
  120. create_download_button();
  121. create_download_all_button();
  122. const urlParams = new URLSearchParams(window.location.search);
  123. if(urlParams.has('instant_download')){
  124. if(!document.getElementsByClassName('seq_video').length){
  125. window.close();
  126. }
  127. close_after_download = true;
  128. instant_download();
  129. }
  130. }