Adds instantRD, 4K, 1080p, 720p buttons at the top of DMM filter bar and allows clearing all filters with Escape
目前為
// ==UserScript==
// @name DMM Top Filter Buttons
// @namespace http://tampermonkey.net/
// @version 1.6
// @description Adds instantRD, 4K, 1080p, 720p buttons at the top of DMM filter bar and allows clearing all filters with Escape
// @author Waseem
// @match https://debridmediamanager.com/*
// @grant none
// @run-at document-idle
// @locale en
// ==/UserScript==
(function() {
'use strict';
// Helper to set React-controlled input value correctly
function setReactValue(element, value) {
const nativeSetter = Object.getOwnPropertyDescriptor(
window.HTMLInputElement.prototype, 'value'
).set;
nativeSetter.call(element, value);
element.dispatchEvent(new Event('input', { bubbles: true }));
}
// Define buttons: text to display => value to insert
const buttons = [
{ text: 'instantRD', value: 'videos:>0', class: 'dmm-instantrd' },
{ text: '4K', value: '2160p', class: 'dmm-4k' },
{ text: '1080p', value: '1080p', class: 'dmm-1080p' },
{ text: '720p', value: '720p', class: 'dmm-720p' }
];
function addFilterButtons() {
const container = document.querySelector(
'#__next > div > div.mb-2.flex.items-center.gap-2.overflow-x-auto.p-2 > div'
);
const input = document.querySelector('#query');
if (!container || !input) return;
// Add each button at the **beginning** of the container
buttons.slice().reverse().forEach(btn => { // reverse to maintain visual order
if (container.querySelector(`span.${btn.class}`)) return; // avoid duplicates
const span = document.createElement('span');
span.textContent = btn.text;
span.className =
`${btn.class} cursor-pointer whitespace-nowrap rounded border border-blue-500 bg-blue-900/30 px-2 py-0.5 text-xs text-blue-100 transition-colors hover:bg-blue-800/50`;
container.insertBefore(span, container.firstChild); // insert at top
// Click inserts filter value
span.addEventListener('click', () => {
const current = input.value.trim();
setReactValue(input, current ? `${current} ${btn.value}` : btn.value);
});
});
}
// Clear all filters on Escape key
function setupEscapeClear() {
const input = document.querySelector('#query');
if (!input) return;
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
setReactValue(input, '');
}
});
}
// Observe DOM for filter bar and input
const observer = new MutationObserver(() => {
addFilterButtons();
setupEscapeClear();
});
observer.observe(document.body, { childList: true, subtree: true });
})();