B站高能进度条跳转工具-追番利器-跳片头片尾-跳高能

出现高能进度条的视频播放中按下P键即可跳转到当前时间后最近一次的高能处

  1. // ==UserScript==
  2. // @name B站高能进度条跳转工具-追番利器-跳片头片尾-跳高能
  3. // @namespace https://eliotzhang.club
  4. // @homepage https://eliotzhang.club
  5. // @version 1.1
  6. // @description 出现高能进度条的视频播放中按下P键即可跳转到当前时间后最近一次的高能处
  7. // @author EliotZhang
  8. // @match *://www.bilibili.com/*
  9. // @run-at document-end
  10. // @grant unsafeunsafeWindow
  11. // ==/UserScript==
  12.  
  13. (function () {
  14. 'use strict';
  15.  
  16. // My code here...
  17. // 可调参数!
  18. let threshold = 55; // 高能阈值。只有高于此值才被当作高能点。范围:0~100。默认:55
  19. let interval = 5; // 两个高能点之间的最小间隔。即:从第二个高能点开始,每个高能点与前一个高能点间的最小间隔。单位:秒。默认:5
  20. let bias = 0; // 跳转到高能点时附加的时间偏移量。单位:秒。默认:0
  21. ////////////////
  22. // 下面无需更改!
  23. let tail = '\nbilibiliDanmuSkip by EliotZhang';
  24. let timeTable = null;
  25. let cid = null;
  26.  
  27. function getPoints() {
  28. if (!unsafeWindow.player || unsafeWindow.player.getVideoMessage().cid == cid)
  29. return;
  30. cid = unsafeWindow.player.getVideoMessage().cid;
  31. console.log('Getting points...', tail);
  32. var elePath = document.getElementById('pbp-curve-path').firstChild;
  33. if (!elePath)
  34. return;
  35. let duration = Math.floor(unsafeWindow.player.getDuration());
  36. var len = elePath.getTotalLength();
  37. var points = [];
  38. let las = -999;
  39. let lpt = elePath.getPointAtLength(0 * len / duration);
  40. let pt = elePath.getPointAtLength(1 * len / duration);
  41. for (var i = 2; i < duration; i++) {
  42. var rpt = elePath.getPointAtLength(i * len / duration);
  43. if (pt.y <= 100 - threshold && pt.x > 0.01 && pt.x < 1000 && lpt.y >= pt.y && rpt.y >= pt.y) {
  44. let xt = pt.x / 1000 * duration;
  45. if (las === -999)
  46. las = xt - interval - 1;
  47. if (xt - las > interval) {
  48. las = xt;
  49. points.push([xt, pt.y]);
  50. }
  51. }
  52. lpt = pt;
  53. pt = rpt;
  54. }
  55. console.log(points, tail);
  56. timeTable = points;
  57. console.log('Got points!', tail);
  58. }
  59.  
  60. function jump() {
  61. if (timeTable == null || timeTable.length == 0 || !unsafeWindow.player) {
  62. console.log('No jump point found!', tail);
  63. return;
  64. }
  65. for (var i = 0; i < timeTable.length; ++i) {
  66. if (timeTable[i][0] > unsafeWindow.player.getCurrentTime()) {
  67. unsafeWindow.player.seek(timeTable[i][0] + bias);
  68. break;
  69. }
  70. }
  71. }
  72.  
  73. function keydownHandler(e) {
  74. let keycode = e.which;
  75. let keyname = String.fromCharCode(keycode);
  76. console.log('Get key: ' + keyname, tail);
  77. if (keyname == 'P') {
  78. getPoints();
  79. jump();
  80. }
  81. }
  82.  
  83. function bindEvent() {
  84. console.log('Binding Event!', tail);
  85. // Bind keydown event
  86. document.onkeydown = keydownHandler;
  87. console.log('Binded Event!', tail);
  88. }
  89.  
  90. function start() {
  91. console.log('Started running!', tail);
  92. // Bind event
  93. bindEvent();
  94. }
  95.  
  96. // Main call
  97. setTimeout(start, 5000);
  98. })();