Greasy Fork

1337x - Mark Untrusted

Marks torrents uploaded by untrusted users by fetching names from the pirated games list.

// ==UserScript==
// @name         1337x - Mark Untrusted
// @namespace    https://greasyfork.org/es/users/825144-aitronz
// @version      1.5
// @description  Marks torrents uploaded by untrusted users by fetching names from the pirated games list.
// @author       aitronz
// @match        *://1337x.to/*
// @match        *://1337x.st/*
// @match        *://x1337x.ws/*
// @match        *://x1337x.eu/*
// @match        *://x1337x.se/*
// @match        *://x1337x.cc/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    const userListURL = 'https://rentry.org/pgames/raw';

    const normalizeName = name => {
        let normalized = name.replace(/\s+/g, '').toLowerCase().replace(/[^a-z0-9]/g, '');
        return normalized.includes('igggames') && !normalized.includes('igggamescom') ? normalized + 'com' : normalized;
    };

    const markRows = userList => {
        document.querySelectorAll('table.table-list tbody tr').forEach(row => {
            const uploaderCell = row.querySelector('.coll-5 a');
            if (uploaderCell) {
                const normalizedUploader = normalizeName(uploaderCell.textContent.trim());
                if (userList.includes(normalizedUploader)) {
                    row.style.cssText = 'background-color: #cccccc; opacity: 0.5; position: relative;';
                    const untrustedLabel = Object.assign(document.createElement('div'), {
                        textContent: 'Untrusted',
                        style: 'position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); color: red; font-size: 20px; font-weight: bold; text-align: center; line-height: ' + row.offsetHeight + 'px; pointer-events: none; z-index: 1;'
                    });
                    row.appendChild(untrustedLabel);
                }
            }
        });
    };

    const fetchUserList = () => {
        fetch(userListURL)
            .then(response => response.text())
            .then(data => {
                const userList = [];
                const startSection = "###Untrusted uploaders";
                const endSection = "*****";
                const startIdx = data.indexOf(startSection);
                const endIdx = data.indexOf(endSection, startIdx);
                const untrustedSection = data.substring(startIdx, endIdx);
                const lines = untrustedSection.split("\n");
                const exclusionPhrase = "Any user from The Pirate Bay / TPB";

                lines.forEach(line => {
                    const trimmedLine = line.trim();
                    if (trimmedLine.startsWith("-")) {
                        if (!trimmedLine.includes(exclusionPhrase)) {
                            let uploader = trimmedLine.slice(1).replace(/\*/g, '').trim();
                            if (uploader.includes(" - ")) {
                                uploader = uploader.split(" - ")[0].trim();
                            }
                            userList.push(...uploader.split("/").map(normalizeName));
                        }
                    }
                });

                console.log('List of untrusted uploaders:', userList);
                markRows(userList);
            })
            .catch(console.error);
    };

    const waitForTable = () => {
        const checkInterval = setInterval(() => {
            if (document.querySelector('table.table-list tbody')) {
                clearInterval(checkInterval);
                fetchUserList();
            }
        }, 50);
    };

    waitForTable();
})();