Open YT videos in a new tab

Opens YouTube video links in a new tab in the background

  1. // ==UserScript==
  2. // @name Open YT videos in a new tab
  3. // @description Opens YouTube video links in a new tab in the background
  4. // @namespace https://gf.qytechs.cn/users/124677-pabli
  5. // @author Pabli
  6. // @version 1.0.2
  7. // @license MIT
  8. // @match *://www.youtube.com/*
  9. // @match *://m.youtube.com/*
  10. // @match *://youtube.com/*
  11. // @match *://youtu.be/*
  12. // @run-at document-start
  13. // @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgODg3LjkgNjEyLjMiPjxwYXRoIGZpbGw9IiNmMDMiIGQ9Ik00NDMuNSA2MTIuM3MyNzguMiAwIDM0Ny4xLTE4LjRhMTEwLjggMTEwLjggMCAwIDAgNzguMy03Ny41YzE5LTY4IDE5LTIxMSAxOS0yMTFzMC0xNDIuMS0xOS0yMDkuNGExMDkgMTA5IDAgMCAwLTc4LjMtNzcuNUM3MjEuNiAwIDQ0My41IDAgNDQzLjUgMFMxNjYgMCA5Ny4zIDE4LjdhMTExLjggMTExLjggMCAwIDAtNzkgNzcuNEMwIDE2My41IDAgMzA1LjYgMCAzMDUuNnMwIDE0Mi45IDE4LjMgMjEwLjljMTAuOSAzNyA0MC43IDY3LjEgNzguOSA3Ny41IDY4LjcgMTguNCAzNDYuMiAxOC40IDM0Ni4yIDE4LjRaIi8+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS13aWR0aD0iOTIuNiIgZD0iTTI2OSAzMDYuMmgzNTBtLTE3NSAxNzV2LTM1MCIvPjwvc3ZnPg==
  14. // @grant GM_info
  15. // @grant GM_notification
  16. // @grant GM_openInTab
  17. // @grant GM_setValue
  18. // @grant GM_getValue
  19. // @grant GM_registerMenuCommand
  20. // @grant GM_unregisterMenuCommand
  21. // ==/UserScript==
  22.  
  23. (async () => {
  24. 'use strict';
  25.  
  26. let settings = {
  27. loadInBackground: {
  28. value: await GM_getValue('loadInBackground', true),
  29. label: 'Open a new tab in the background',
  30. },
  31. subscriptionsPageOnly: {
  32. value: await GM_getValue('subscriptionsPageOnly', false),
  33. label: 'Subscriptions page only',
  34. },
  35. };
  36. let menuCommands = {};
  37. async function updateMenu() {
  38. Object.keys(menuCommands).forEach(key => GM_unregisterMenuCommand(menuCommands[key]));
  39. Object.entries(settings).forEach(([key, config]) => {
  40. menuCommands[key] = GM_registerMenuCommand(
  41. `${config.value ? '☑' : '☐'} ${config.label}`,
  42. async () => {
  43. settings[key].value = !settings[key].value;
  44. await GM_setValue(key, settings[key].value);
  45. GM_notification(`${config.value ? 'Enabled' : 'Disabled'} - ${config.label}`, GM_info.script.name, GM_info.script.icon);
  46. updateMenu();
  47. }
  48. );
  49. });
  50. }
  51. updateMenu();
  52.  
  53. window.addEventListener('click', (e) => {
  54. if (settings.subscriptionsPageOnly.value === true && window.location.pathname !== '/feed/subscriptions') return;
  55.  
  56. if (e.button > 0 || e.altKey || e.metaKey) return;
  57.  
  58. const link = e.target.closest('[href^="/watch"], [href^="/shorts"]');
  59. if (!link) return;
  60.  
  61. if (new URL(window.location.href).searchParams.get('v') === new URL(link.href).searchParams.get('v')) return;
  62.  
  63. e.preventDefault();
  64. e.stopPropagation();
  65. e.stopImmediatePropagation();
  66.  
  67. GM_openInTab(link.href, settings.loadInBackground.value);
  68. }, true);
  69.  
  70. })();

QingJ © 2025

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