Sleazy Fork is available in English.
Allows to hide unwanted categories everywhere and remember tracker search options, fixes some things
// ==UserScript== // @name PornoLab Hider-Fixer // @namespace copyMister // @version 1.1 // @description Allows to hide unwanted categories everywhere and remember tracker search options, fixes some things // @description:ru Позволяет скрывать ненужные категории отовсюду и запоминать настройки поиска по трекеру, исправляет некоторые вещи // @author copyMister // @license MIT // @match https://pornolab.net/forum/* // @match https://pornolab.cc/forum/* // @match https://pornolab.biz/forum/* // @match https://pornolab.lib/forum/* // @require https://cdn.jsdelivr.net/npm/@github/[email protected]/dist/check-all.umd.js // @icon https://www.google.com/s2/favicons?sz=64&domain=pornolab.net // @run-at document-body // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @homepageURL https://pornolab.net/forum/viewtopic.php?t=2714164 // ==/UserScript== var hiddenCats = JSON.parse(GM_getValue('hiddenCats', '[]')); var torrentCats = [36,38,60,284,508,509,512,553,555,883,902,903,997,1110,1111,1112,1124,1143,1296,1450,1451,1644,1646,1671,1673,1675,1676,1678,1679,1680,1681,1682,1683,1685,1689,1691,1692,1707,1711,1712,1713,1715,1718,1719,1720,1726,1728,1729,1731,1733,1734,1735,1740,1741,1750,1752,1754,1755,1756,1757,1758,1760,1762,1763,1765,1767,1768,1769,1775,1777,1780,1781,1784,1785,1787,1788,1789,1790,1791,1792,1793,1797,1798,1801,1802,1803,1804,1805,1815,1818,1819,1820,1823,1825,1826,1827,1828,1829,1830,1831,1834,1836,1837,1842,1843,1845,1846,1847,1849,1851,1853,1856,1857,1859,1861,1862,1863,1864,1865,1867,1868,1869,1870,1872,1873]; var adsCats = [1753, 1761, 1821]; var menuFields = ['tracker_torrent', 'tracker_hide', 'tracker_less', 'tracker_params', 'tracker_forums', 'tracker_focus', 'tracker_second', 'link_exclude', 'link_forums', 'link_params', 'search_topics', 'search_msgs', 'search_hide', 'other_qsearch', 'other_buttons', 'mode_edit', 'mode_cats']; var menuDefaults = [true, true, true, false, false, true, true, false, false, false, true, true, true, true, true, true, true]; var options = JSON.parse(GM_getValue('options', null)); if (!options) { options = defaultOptions(); } function defaultOptions() { var obj = {}; menuFields.forEach(function(item, ind) { obj[item] = menuDefaults[ind]; }); return obj; } function saveOptions(custom) { GM_setValue('options', JSON.stringify(custom ? custom : options)); } function menuHtml(title, id) { var disabled = (id === 'link_exclude' && options.link_forums) || (id === 'link_forums' && options.link_exclude); return `<label><input id="hfix_${id}" type="checkbox" ${options[id] ? 'checked' : ''} ${disabled ? 'disabled' : ''} >${title}</label>`; } function closeMenu() { document.querySelector('#hfix-btn').click(); } function addCheckbox(elem, isItem) { var forumId = parseInt(elem.lastElementChild.href.split('=')[1]); var isChecked = hiddenCats.includes(forumId); elem.insertAdjacentHTML( 'beforeend', `<input class="hide-cbox" type="checkbox" title="Скрывать" ${isChecked ? 'checked' : ''} ${isItem ? 'data-check-all-item' : 'data-check-all'}>` ); } (function() { 'use strict'; var cssCode = [ '#hfix-menu .menu-header { position: relative; }', '#hfix-menu .menu-btn { position: absolute; bottom: 3px; height: 19.33px; }', '#hfix-menu label { user-select: none; }', '#hfix-menu > table, #hfix-menu fieldset { border-collapse: collapse; height: 100%; }', '#hfix-reload { width: 50%; }', '#hfix-menu td { padding: 4px; }', '#hfix-res-opt { left: 3px; }', '#hfix-res-cat { right: 3px; }', '.forums tr[id^="f-"]:not(:has(a[href*="viewforum.php"])) { display: none; }', '#fs optgroup:not(:has(> option)) { display: none; }', ].join('\n'); if (options.mode_edit) { cssCode += [ '.hide-cbox { float: left; margin: 2px 7px 0 0 !important; }', ':is(.forumlink, .subforums > .sf_title):has(> .hide-cbox:checked) { filter: grayscale(1); }', ].join('\n'); } if (options.other_buttons) { cssCode += [ 'a.menu-root[href="#pg-jump"] ~ :is(b, a) { padding: 4px 7px; margin-right: 1px; border: 1px solid #969696; border-radius: 4px; text-decoration: none; }', 'a.menu-root[href="#pg-jump"] ~ :is(b, a:hover) { background-color: rgba(124, 190, 255, .3); text-decoration: none !important; }', '.bottom_info .nav, #pagination .nav { padding: 1em 6px; margin: 0; }', ].join('\n'); } GM_addStyle(cssCode); $.holdReady(true); document.addEventListener('DOMContentLoaded', function() { document.querySelector('#main-nav td').insertAdjacentHTML( 'beforeend', '<a href="#hfix-menu" id="hfix-btn" class="menu-root bold">Hider-Fixer</a>' ); document.body.insertAdjacentHTML( 'beforeend', `<div class="menu-sub" id="hfix-menu"> <table> <tr> <th colspan="2" class="menu-header pad_6">Опции юзерскрипта Hider-Fixer <input id="hfix-res-opt" class="menu-btn" type="submit" value="🔄 опции" title="Вернуть опции по умолчанию"> <input id="hfix-res-cat" class="menu-btn" type="submit" value="🔄 форумы" title="Снять отметки со всех форумов"> </th> </tr> <tr><td rowspan="2"><fieldset> <legend>Трекер</legend> <div class="pad_4"> ${menuHtml('Скрывать торренты', 'tracker_torrent')} ${menuHtml('Убирать скрытые форумы', 'tracker_hide')} ${menuHtml('Убирать лишние категории', 'tracker_less')} ${menuHtml('Запоминать выбранные форумы', 'tracker_forums')} ${menuHtml('Запоминать параметры', 'tracker_params')} ${menuHtml('Фокус на поле поиска', 'tracker_focus')} ${menuHtml('Вторая строка поиска', 'tracker_second')} </div> </fieldset></td> <td><fieldset> <legend>Ссылка на Трекер</legend> <div class="pad_4"> ${menuHtml('Исключать скрытые форумы', 'link_exclude')} ${menuHtml('Добавлять выбранные форумы', 'link_forums')} ${menuHtml('Добавлять параметры', 'link_params')} </div> </fieldset></td></tr> <tr><td><fieldset> <legend>Поиск</legend> <div class="pad_4"> ${menuHtml('Скрывать темы', 'search_topics')} ${menuHtml('Скрывать сообщения', 'search_msgs')} ${menuHtml('Убирать скрытые форумы', 'search_hide')} </div> </fieldset></td></tr> <tr><td><fieldset> <legend>Главная</legend> <div class="pad_4"> ${menuHtml('Режим редактирования', 'mode_edit')} ${menuHtml('Скрывать форумы (вне режима)', 'mode_cats')} </div> </fieldset></td> <td><fieldset> <legend>Разное</legend> <div class="pad_4"> ${menuHtml('Запоминать тип быстрого поиска', 'other_qsearch')} ${menuHtml('Номера страниц в виде кнопок', 'other_buttons')} </div> </fieldset></td></tr> <tr><th colspan="2" class="pad_4"> <input id="hfix-reload" type="submit" value="Обновить страницу" title="Для применения опций"> </th></tr> </table> </div>` ); document.querySelector('#hfix-res-opt').addEventListener('click', function() { saveOptions(defaultOptions()); closeMenu(); }); document.querySelector('#hfix-res-cat').addEventListener('click', function() { GM_setValue('hiddenCats', '[]'); closeMenu(); }); document.querySelector('#hfix-reload').addEventListener('click', function() { window.location.reload(); }); menuFields.forEach(function(item) { document.querySelector(`#hfix_${item}`).addEventListener('change', function() { if (this.id === 'hfix_link_exclude') { document.querySelector(`#hfix_link_forums`).disabled = this.checked; } else if (this.id === 'hfix_link_forums') { document.querySelector(`#hfix_link_exclude`).disabled = this.checked; } options[item] = this.checked; saveOptions(); }); }); var quickSearch = document.querySelector('#search-action'); if (quickSearch) { if (options.other_qsearch && options.qsearch_type) { quickSearch.value = options.qsearch_type; } quickSearch.addEventListener('change', function() { options.qsearch_type = this.value; saveOptions(); }); } var trackerLink = document.querySelector('#main-nav a[href^="tracker.php"]'); if (trackerLink) { var href = 'tracker.php?'; if (options.link_exclude && hiddenCats.length > 0) { href += 'fn=1&f='; hiddenCats.forEach(function(fid) { if (torrentCats.includes(fid)) { href += fid + ','; } }); } else if (options.link_forums && options.tracker_selected && options.tracker_selected.length > 0) { href += 'f='; options.tracker_selected.forEach(function(fid) { href += fid + ','; }); } if (options.link_params && options.tracker_options) { if (href.endsWith(',')) { href = href.slice(0, -1); href += '&'; } Object.keys(options.tracker_options).forEach(function(key) { if (key === 'fn' && options.link_exclude) { return; } href += `${key}=${options.tracker_options[key]}&`; }); } href = href.slice(0, -1); trackerLink.href = href; } if (document.querySelector('.forumlink')) { if (options.mode_edit) { document.querySelectorAll('.subforums > .sf_title').forEach(function(forum) { addCheckbox(forum, true); }) document.querySelectorAll('.forumlink').forEach(function(category) { if (category.firstElementChild.href.startsWith('https://pornolab')) { addCheckbox(category, false); checkAll.default(category.parentElement); } }); document.querySelectorAll('.hide-cbox').forEach(function(cbox) { cbox.addEventListener('change', function() { var forumId = parseInt(cbox.previousElementSibling.href.split('=')[1]); var found = hiddenCats.indexOf(forumId); if (this.checked && found === -1) { hiddenCats.push(forumId); } if (!this.checked && found !== -1) { hiddenCats.splice(found, 1); } GM_setValue('hiddenCats', JSON.stringify(hiddenCats)); }); }); } else if (options.mode_cats) { hiddenCats.forEach(function(fid) { var forum = document.querySelector(`:is(.forumlink, .subforums) a[href$="f=${fid}"]`); if (forum) { if (forum.parentElement.classList.contains('forumlink')) { forum.closest('tr').remove(); } else { forum.closest('span').remove(); } } }); } } if (options.search_topics && document.querySelector('.topictitle') && !document.querySelector('.dl-chbox, #show-edit-btn')) { hiddenCats.forEach(function(fid) { var rows = document.querySelectorAll(`.forumline a[href$="f=${fid}"]`); if (rows.length > 0) { rows.forEach(function(td) { td.closest('tr').remove(); }); } }); } if (options.search_msgs && document.querySelector('.cat.nav')) { hiddenCats.forEach(function(fid) { var cats = document.querySelectorAll(`.cat.nav > a[href$="f=${fid}"]`); if (cats.length > 0) { cats.forEach(function(cat) { var root = cat.closest('tr'); var msg = root.nextElementSibling; while (msg.hasAttribute('class')) { var nextMsg = msg.nextElementSibling; msg.remove(); msg = nextMsg; } root.remove(); }); } }); } if (options.search_hide && document.querySelector('form[action="search.php"] #fs')) { document.querySelectorAll('select[name="f[]"] > optgroup > option[id^="fs-"]').forEach(function(opt) { if (hiddenCats.concat(adsCats).includes(parseInt(opt.value))) { opt.remove(); } }); } var trackerForm = document.querySelector('#tr-form'); if (trackerForm) { if (options.tracker_torrent) { document.querySelectorAll('#tor-tbl .gen.f').forEach(function(link) { if (hiddenCats.includes(parseInt(link.href.split('=')[1]))) { link.closest('tr').remove(); } }); } if (options.tracker_less) { document.querySelectorAll('#fs-main > optgroup:not([label$="Releases"])').forEach(function(cat) { cat.remove(); }); } if (options.tracker_hide) { document.querySelectorAll('#fs-main option').forEach(function(opt) { if (hiddenCats.includes(parseInt(opt.value))) { opt.remove(); } }); } if (options.tracker_forums) { if (options.tracker_selected && options.tracker_selected.length > 0) { document.querySelectorAll('#fs-main option').forEach(function(opt) { opt.selected = options.tracker_selected.includes(opt.value); }); } trackerForm.addEventListener('submit', function() { options.tracker_selected = []; document.querySelectorAll('#fs-main option').forEach(function(opt) { if (opt.selected && opt.value !== '-1' && torrentCats.includes(parseInt(opt.value))) { options.tracker_selected.push(opt.value); } }); saveOptions(); }); } if (options.tracker_params) { var inputs = '.fieldsets fieldset:not([id="fs"]) :is(input, select)'; if (options.tracker_options) { document.querySelectorAll(inputs).forEach(function(elem) { if (options.tracker_options[elem.name]) { if (elem.type === 'select-one') { elem.value = options.tracker_options[elem.name]; } else if (elem.value === options.tracker_options[elem.name]) { elem.checked = true; } } }); } trackerForm.addEventListener('submit', function() { options.tracker_options = {}; document.querySelectorAll(inputs).forEach(function(elem) { if (!['hidden', 'text', 'search'].includes(elem.type) && !elem.disabled) { if (elem.type === 'select-one' || elem.checked) { options.tracker_options[elem.name] = elem.value; } } }); saveOptions(); }); } var titleSearch = document.querySelector('#title-search'); if (options.tracker_focus) { titleSearch.focus(); } if (options.tracker_second) { var secondValue = options.second_search ?? ''; if (secondValue) { titleSearch.value = titleSearch.value.replace(secondValue, ''); } titleSearch.parentElement.insertAdjacentHTML( 'afterend', `<p class="input"> <input id="second-search" style="width: 95%;" type="search" size="50" value="${secondValue.replaceAll('"', '"')}"> <a id="second-icon" class="med" href="#" style="font-size: 0.9rem;" title="Вторая строка с запоминанием и автоматической подстановкой; нажмите для вставки заготовки"> <i class="fas fa-question-circle"></i> </a> </p>` ); var secondSearch = document.querySelector('#second-search'); document.querySelector('#second-icon').addEventListener('click', function(e) { e.preventDefault(); secondSearch.focus(); secondSearch.value = '-transex* -transsex* -=trans -shemale -scat -defecation -cbt -strapon -="strap-on" -yaoi -futanari -=futa'; }); trackerForm.addEventListener('submit', function(e) { e.preventDefault(); secondSearch.value = secondSearch.value.trim(); if (secondSearch.value) { titleSearch.value = titleSearch.value.trim() + ' ' + secondSearch.value; } options.second_search = secondSearch.value; saveOptions(); secondSearch.value = ''; trackerForm.submit(); }); } } $.holdReady(false); }); })();