fork download
  1. javascript: var download = function(text, filename, type) {
  2. let b = new Blob([text], {
  3. type: type || 'text/plain'
  4. });
  5. let a = document.createElement("a");
  6. a.href = URL.createObjectURL(b);
  7. a.setAttribute("download", filename);
  8. a.click();
  9. };
  10. var findPssh = function(base64Str) {
  11. var ba = Uint8Array.from(atob(base64Str), c => c.charCodeAt(0));
  12. for (let i = 0, f = false; i < ba.length - 5; i++) {
  13. if (ba[i + 1] == 0x70 && ba[i + 2] == 0x73 && ba[i + 3] == 0x73 && ba[i + 4] == 0x68) {
  14. if (f) {
  15. let p_len = ba[i];
  16. let pssh = ba.slice(i - 3, i + p_len - 3);
  17. return btoa(String.fromCharCode.apply(null, pssh));
  18. }
  19. f = true;
  20. }
  21. }
  22. };
  23. var importCmd5xAsync = async function() {
  24. let jsCode = await fetch("https://s...content-available-to-author-only...i.com/js/common/f6a3054843de4645b34d205a9f377d25.js").then(resp => resp.text());
  25. let script = document.createElement("script");
  26. script.text = jsCode;
  27. document.getElementsByTagName("head")[0].appendChild(script);
  28. };
  29. var importJsZipAsync = async function() {
  30. let jsCode = await fetch("https://c...content-available-to-author-only...e.com/ajax/libs/jszip/3.10.0/jszip.min.js").then(resp => resp.text());
  31. let script = document.createElement("script");
  32. script.text = jsCode;
  33. document.getElementsByTagName("head")[0].appendChild(script);
  34. };
  35. var formatTime = function(dur) {
  36. var date = new Date(0);
  37. date.setSeconds(dur);
  38. return date.toISOString().substr(11, 8).replace(/:/, "h").replace(/:/, "m") + "s";
  39. };
  40. var fetchFlvAsync = async function(info) {
  41. var fs = info.fs;
  42. var content = "#EXTM3U\n";
  43. var prefix = "https://d...content-available-to-author-only...i.com/videos";
  44. let results = fs.map(async fs_i => {
  45. let url = fs_i.l;
  46. let api = prefix + url;
  47. let t = "";
  48. if (playerObject._player.package.engine.adproxy.engine.movieinfo.current.boss) {
  49. t = playerObject._player.package.engine.adproxy.engine.movieinfo.current.boss.data.t;
  50. }
  51. api = prefix + url + "✗domain=1&t=" + t + "&QY00001=" + /qd_uid=(\d+)/g.exec(url)[1] + "&ib=4&ptime=0&ibt=" + cmd5x(t + /\/(\w{10,})/g.exec(url)[1]);
  52. let resp = await fetch(api, {
  53. credentials: 'same-origin'
  54. });
  55. let json = await resp.json();
  56. return "#EXTINF:" + (fs_i.d / 1000).toFixed(2) + "\n" + json["l"];
  57. });
  58. let urls = await Promise.all(results);
  59. content += urls.join('\n');
  60. content += "\n#EXT-X-ENDLIST";
  61. return content;
  62. };
  63. var ndIqyAsync = async function() {
  64. var vTracks = playerObject._player.package.engine.adproxy.engine.movieinfo.current.vidl.filter(a => a.isUsable && a.realArea.width).sort((a, b) => b.vsize - a.vsize);
  65. let info = vTracks[0];
  66. if (vTracks.length > 1) {
  67. let p = "";
  68. vTracks.forEach(function(item, index) {
  69. p += "\r\n[${index}]: [${item.realArea.width}x${item.realArea.height}]_${(item.vsize / 1024 / 1024).toFixed(2)}MB";
  70. });
  71. let _input = prompt("请选择视频" + p);
  72. info = vTracks[Number(_input)];
  73. }
  74. var title = "";
  75. try {
  76. title = document.querySelector('h1.player-title a.title-link[title]')['title'] + "_" + document.querySelector('h1.player-title em').innerText + "_" + info.realArea.width + "_" + info.realArea.height + "_" + formatTime(info.duration) + "_" + (info.vsize / 1024 / 1024).toFixed(2) + "MB";
  77. } catch (err) {
  78. title = document.title + "_" + info.realArea.width + "_" + info.realArea.height + "_" + formatTime(info.duration) + "_" + (info.vsize / 1024 / 1024).toFixed(2) + "MB";
  79. }
  80. var m3u8Content = "";
  81. if (typeof info.playlist == "string" && info.playlist.length > 0) {
  82. m3u8Content = info.playlist;
  83. } else if (typeof info.playlist == "object" && !info.playlist.drm) {
  84. m3u8Content = "#EXTM3U\n" + info.playlist.urls.map((u, i) => "#EXTINF:" + info.playlist.durations[i] + ",\nhttps:" + u + info.playlist.qdp[/\/(\w{10,})/g.exec(u)[1]]).join('\n') + "\n#EXT-X-ENDLIST";
  85. } else if (typeof info.playlist == "object" && info.playlist.drm) {
  86. let keyServer = info.playlist.drm.keySystemServer;
  87. let aTrack1 = info.playlist.m3u8.audio_track1;
  88. let vTrack1 = info.playlist.m3u8.video_track1; /* 生成 audio m3u8 */
  89. let aM3u8 = "#EXTM3U\n";
  90. aM3u8 += "#EXT-X-MAP:URI=\"init.m4a\"\n";
  91. aM3u8 += "#EXT-X-KEY:METHOD=PLZ-KEEP-RAW,URI=\"None\"\n";
  92. let aUrl = aTrack1.files[0].file_name;
  93. for (let i = 0; i < aTrack1.files[0].seekable.time.length - 1; i++) {
  94. let _start = aTrack1.files[0].seekable.pos[i];
  95. let _end = aTrack1.files[0].seekable.pos[i + 1];
  96. let _dur = aTrack1.files[0].seekable.time[i + 1] - aTrack1.files[0].seekable.time[i];
  97. aM3u8 += "#EXTINF:${_dur.toFixed(2)},\n";
  98. aM3u8 += "${aUrl}&start=${_start}&end=${_end}\n";
  99. }
  100. aM3u8 += "\n#EXT-X-ENDLIST"; /* 生成 video m3u8 */
  101. let vM3u8 = "#EXTM3U\n";
  102. vM3u8 += "#EXT-X-MAP:URI=\"init.mp4\"\n";
  103. vM3u8 += "#EXT-X-KEY:METHOD=PLZ-KEEP-RAW,URI=\"None\"\n";
  104. vM3u8 += vTrack1.files.map((u) => "#EXTINF:${u.duration_second.toFixed(2)},\n${u.file_name}&start=${u.seekable.pos_start}&end=${u.seekable.pos_end}").join('\n');
  105. vM3u8 += "\n#EXT-X-ENDLIST"; /* 引入 JSZip */
  106. await importJsZipAsync(); /* zip 打包 */
  107. var zip = new JSZip(); /* 塞入文件 */
  108. zip.file("init.m4a", aTrack1.codec_init, {
  109. base64: true
  110. });
  111. zip.file("init.mp4", vTrack1.codec_init, {
  112. base64: true
  113. });
  114. zip.file("m4a.m3u8", aM3u8);
  115. zip.file("mp4.m3u8", vM3u8);
  116. zip.file("license_url.txt", keyServer);
  117. zip.file("pssh.txt", findPssh(vTrack1.codec_init));
  118. zip.generateAsync({
  119. type: "blob"
  120. }).then(function(content) {
  121. download(content, title + ".zip", "application/octet-stream");
  122. });
  123. } else {
  124. await importCmd5xAsync();
  125. m3u8Content = await fetchFlvAsync(info);
  126. }
  127. if (m3u8Content != "") download(m3u8Content, title + ".m3u8");
  128. };
  129. ndIqyAsync();
Success #stdin #stdout 0.03s 16768KB
stdin
Standard input is empty
stdout
Standard output is empty