为 qBittorrent 的tracker列表增加筛选

在webUI的右键菜单中增加批量复制字段的功能,可直接粘贴到excel

  1. // ==UserScript==
  2. // @name 为 qBittorrent 的tracker列表增加筛选
  3. // @name:en add tracker list filter for qBitorrent webUI
  4. // @namespace localhost
  5. // @version 0.2
  6. // @description 在webUI的右键菜单中增加批量复制字段的功能,可直接粘贴到excel
  7. // @description:en add a contextmenu item to batch copy torrent information in order to pasting to Excel
  8. // @author flashlab
  9. // @match http://127.0.0.1:8080/
  10. // @icon https://www.qbittorrent.org/favicon.ico
  11. // @license MIT
  12. // @run-at document-end
  13. // ==/UserScript==
  14.  
  15. (function() {
  16. 'use strict';
  17.  
  18. const newItem = `<input id="trackersFilterInput" type="text" placeholder="过滤 tracker 列表..." autocomplete="off" autocorrect="off" autocapitalize="none" style="
  19. background-image: url(../images/trackers.svg);
  20. background-repeat: no-repeat;
  21. background-size: 1.3em;
  22. padding: 0 0 0 1.5em;
  23. width: 120px;
  24. margin: 0.2em;
  25. font-size: 13px;">`
  26. window.addEventListener('load', function () {
  27. function waitForElm(selector) {
  28. return new Promise(resolve => {
  29. if (document.querySelector(selector)) {
  30. return resolve(document.querySelector(selector));
  31. }
  32. const observer = new MutationObserver(mutations => {
  33. if (document.querySelector(selector)) {
  34. observer.disconnect();
  35. resolve(document.querySelector(selector));
  36. }
  37. });
  38. observer.observe(document.querySelector('#Filters'), {
  39. childList: true,
  40. subtree: true
  41. });
  42. });
  43. }
  44. waitForElm('#trackerFilterList>li>a>img').then((el) => {
  45. const trackerlist = document.getElementById('trackerFilterList');
  46. if (!trackerlist) return;
  47. const lists = trackerlist.children
  48. if (lists.length == 0) return;
  49. trackerlist.insertAdjacentHTML('beforebegin', newItem)
  50. const filterInput = document.getElementById('trackersFilterInput');
  51. filterInput.style.backgroundImage = `url(${lists[0].querySelector('img').src})`;
  52. function reset() {
  53. Array.from(trackerlist.querySelectorAll('li.invisible')).forEach(
  54. (el) => el.classList.remove('invisible')
  55. );
  56. }
  57. filterInput.addEventListener('keyup', function (e) {
  58. const key = new RegExp(e.target.value, 'gi');
  59. if( e.target.value.length < 2) return reset();
  60. Array.from(lists).slice(1).forEach(
  61. (el) => el.classList.toggle('invisible', !el.innerText.match(key))
  62. )
  63. })
  64. })
  65. })
  66. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址