// ==UserScript== // @name TikTok Enhanced // @name:de TikTok Enhanced // @namespace https://github.com/marmoris-x/tampermonkey-scripts // @version 6.0.2 // @author marmoris-x // @description Enhances TikTok by restoring middle-click, right-click, and fixing broken UI interactions. // @description:de Verbessert TikTok durch Wiederherstellung von Mittelklick, Rechtsklick und repariert kaputte UI-Interaktionen. // @license MIT // @icon https://www.google.com/s2/favicons?sz=64&domain=tiktok.com // @homepageURL https://github.com/marmoris-x/tampermonkey-scripts // @supportURL https://github.com/marmoris-x/tampermonkey-scripts/issues // @downloadURL https://raw.githubusercontent.com/marmoris-x/tampermonkey-scripts/main/dist/TikTok%20Enhanced.user.js // @updateURL https://raw.githubusercontent.com/marmoris-x/tampermonkey-scripts/main/dist/TikTok%20Enhanced.user.js // @match *://*.tiktok.com/* // @tag social // @grant GM_addStyle // @grant window.onurlchange // @run-at document-start // @noframes // ==/UserScript== (function () { 'use strict'; (function() { var LOG_PREFIX = "[TikTok Enhanced]"; function createLogger() { var debugMode = false; return { log: function() { var args = [LOG_PREFIX]; for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); console.log.apply(console, args); }, info: function() { var args = [LOG_PREFIX]; for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); console.info.apply(console, args); }, warn: function() { var args = [LOG_PREFIX]; for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); console.warn.apply(console, args); }, error: function() { var args = [LOG_PREFIX]; for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); console.error.apply(console, args); }, debug: function() { if (!debugMode) return; var args = [LOG_PREFIX]; for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); console.debug.apply(console, args); }, setDebug: function(v) { debugMode = !!v; } }; } var log = createLogger(); var CSS_RULES = [ 'a[class*="LinkNonClickable"],', 'a[data-e2e="feed-video"],', 'a[href*="/video/"]:not([class*="LinkNonClickable"]) {', " pointer-events: auto !important;", " cursor: pointer !important;", "}", ".event-delegate-mask,", 'div[class*="DivPlayerContainer"] {', " pointer-events: none !important;", "}" ].join("\n"); function injectStyles() { GM_addStyle(CSS_RULES); log.info("Styles injected"); } function findVideoLink(target) { var link = target.closest('a[href*="/video/"]'); if (link) return link; var current = target; var MAX_DEPTH = 10; for (var depth = 0; current && depth < MAX_DEPTH; depth++) { link = current.querySelector('a[href*="/video/"]'); if (link) return link; current = current.parentElement; } return null; } function onAuxClick(event) { if (event.button !== 1) return; event.stopPropagation(); event.stopImmediatePropagation(); event.preventDefault(); var link = findVideoLink(event.target); if (link && link.href) { window.open(link.href, "_blank"); log.debug("Middle-click opened: " + link.href); } } function onContextMenu(event) { event.stopPropagation(); event.stopImmediatePropagation(); } function onMouseDown(event) { if (event.button === 1) { event.preventDefault(); } } function attachInterceptors() { window.addEventListener("auxclick", onAuxClick, true); window.addEventListener("contextmenu", onContextMenu, true); window.addEventListener("mousedown", onMouseDown, true); log.info("Event interceptors attached"); } var initialized = false; function init() { if (initialized) return; initialized = true; log.info("Starting TikTok Enhanced v6.0.0"); injectStyles(); attachInterceptors(); log.info("Initialization complete"); } init(); if (typeof window.onurlchange !== "undefined") { window.addEventListener("urlchange", function() { initialized = false; init(); }); } })(); })();