Скрипты для торрент трекеров

Страницы :   Пред.  1, 2, 3 ... 12, 13, 14
Ответить
 

(@_@-)

Стаж: 2 года 10 месяцев

Сообщений: 345

(@_@-) · 20-Авг-24 23:56 (1 год 1 месяц назад)

EL-34 писал(а):
86608942(@_@-)
Никак.
Правда?
Темные темы делают, а светлые нет?
[Профиль]  [ЛС] 

EL-34

Top Bonus 10* 1PB

Стаж: 17 лет 8 месяцев

Сообщений: 8322

EL-34 · 21-Авг-24 07:55 (спустя 7 часов, ред. 21-Авг-24 07:55)

(@_@-)
Это вам не в форумные игры играть.
На многих сайтах эта возможность встроена, как например в одноклассниках и вконтакте.
Светлая, тёмная, как в системе.
[Профиль]  [ЛС] 

(@_@-)

Стаж: 2 года 10 месяцев

Сообщений: 345

(@_@-) · 21-Авг-24 11:50 (спустя 3 часа)

EL-34
Где встроено, я в курсе.
На рутрекере нет тем, но можно сторонними расширениями сделать темную тему.
[Профиль]  [ЛС] 

EL-34

Top Bonus 10* 1PB

Стаж: 17 лет 8 месяцев

Сообщений: 8322

EL-34 · 21-Авг-24 11:52 (спустя 2 мин.)

(@_@-) писал(а):
86612008можно сторонними расширениями сделать темную тему.
И даже без расширений можно, например в Опере.
[Профиль]  [ЛС] 

(@_@-)

Стаж: 2 года 10 месяцев

Сообщений: 345

(@_@-) · 21-Авг-24 12:00 (спустя 7 мин.)

EL-34
Вот, уже не никак, а можно
А светлую тему опера не делает?
[Профиль]  [ЛС] 

raddyst

Стаж: 11 лет 8 месяцев

Сообщений: 630


raddyst · 21-Авг-24 12:11 (спустя 10 мин.)

(@_@-) писал(а):
86612042А светлую тему опера не делает?
Попробуйте букмарклеты: Light Mode Bookmarlet и Dark Mode - Javascript Bookmarklet
[Профиль]  [ЛС] 

(@_@-)

Стаж: 2 года 10 месяцев

Сообщений: 345

(@_@-) · 21-Авг-24 12:18 (спустя 7 мин.)

raddyst
О! Спасибо, попробую.
[Профиль]  [ЛС] 

RewTeyi

Стаж: 3 года 4 месяца

Сообщений: 527

RewTeyi · 14-Фев-25 00:40 (спустя 5 месяцев 23 дня)

Цитата:
IMDb Scout
Может знает кто, есть ли подобный скрипт для TMDB?
[Профиль]  [ЛС] 

raddyst

Стаж: 11 лет 8 месяцев

Сообщений: 630


raddyst · 14-Фев-25 02:37 (спустя 1 час 56 мин.)

RewTeyi писал(а):
87394356Может знает кто, есть ли подобный скрипт для TMDB?
Локализованных не встречал, разве что torrent-quick-search и исключительно для passthepopcorn
[Профиль]  [ЛС] 

oi

Стаж: 17 лет 5 месяцев

Сообщений: 584

oi · 24-Фев-25 00:56 (спустя 9 дней, ред. 24-Фев-25 00:56)

TeamHD One Click Torrent Downloader
Добавляет кнопку "Download All" на сайт teamhd.org для массовой загрузки .torrent файлов со страницы поиска.
Обычное нажатие загружает только .torrent файлы, с которыми нет активного взаимодействия (раздача/загрузка).
Долгое нажатие (3 секунды) включает режим "Force Download All", позволяя скачать все .torrent файлы, включая те, что в активной закачке/раздаче.
Кнопка отображает количество доступных файлов и показывает прогресс загрузки.
Есть возможность поставить на паузу и возобновить загрузку при повторном нажатии на кнопку.
Загрузка происходит раз в секунду чтобы не напрягать сервер большими выгрузками.
гифка
скриптец
Код:
// ==UserScript==
// @name         TeamHD One Click Torrent Downloader
// @namespace    http://tampermonkey.net/
// @version      0.1.020
// @description  Adds a Download All button to download all .torrent links on teamhd.org with progress indication, pre-download count, pause/resume with status, and long press functionality
// @author       oi
// @match        https://teamhd.org/browse*
// @grant        GM_download
// ==/UserScript==
(function() {
    'use strict';
    let downloadAllButton;
    let longPressTimer;
    let textChangeTimer;
    const longPressDuration = 3000; // 3 seconds
    const textChangeDelay = 500; // 0.5 seconds
    let isPaused = false;
    let isDownloading = false;
    let currentDownloadIndex = 0;
    let currentTorrents = [];
    // Function to download a file using simulated click
    function downloadFile(url, filename) {
        const link = document.createElement('a');
        link.href = url;
        link.download = filename;
        link.style.display = 'none';
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        console.log(`Simulated click for: ${filename}`);
    }
    // Function to gather all .torrent links with interaction check
    function getAllTorrentLinks(includeInteracted = false) {
        const links = document.querySelectorAll('a[href*="download.php?id="]');
        return Array.from(links).map(link => {
            const parentTd = link.closest('td');
            const isInteracted = parentTd.querySelector('.badgget.seeder, .badgget.leecher') !== null;
            return {
                url: link.href.startsWith('http') ? link.href : window.location.origin + '/' + link.getAttribute('href'),
                filename: decodeURIComponent((link.href.split('name=')[1] || 'file.torrent').split('&')[0]),
                interacted: isInteracted
            };
        }).filter(torrent => includeInteracted || !torrent.interacted);
    }
    // Function to update button progress with red progress bar
    function updateButtonProgress(downloaded, total) {
        const percent = Math.round((downloaded / total) * 100);
        downloadAllButton.textContent = `${isPaused ? 'Paused' : 'Downloading'} ${downloaded}/${total} (${percent}%)`;
        downloadAllButton.style.background = `linear-gradient(to right, red ${percent}%, #28a745 ${percent}%)`;
    }
    // Function to display initial count of torrents
    function displayInitialCount() {
        const allTorrents = getAllTorrentLinks(true);
        const nonInteractedTorrents = getAllTorrentLinks(false);
        downloadAllButton.textContent = `Download All (${nonInteractedTorrents.length}/${allTorrents.length})`;
    }
    // Function to download torrents with delay and pause/resume functionality
    async function downloadAllTorrents(event, includeInteracted = false) {
        if (event) {
            event.preventDefault();
            event.stopPropagation();
        }
        if (isDownloading) {
            isPaused = !isPaused;
            updateButtonProgress(currentDownloadIndex, currentTorrents.length);
            return;
        }
        currentTorrents = getAllTorrentLinks(includeInteracted);
        if (currentTorrents.length === 0) {
            console.log('No torrents found to download.');
            downloadAllButton.textContent = 'No Torrents Found';
            downloadAllButton.style.backgroundColor = 'gray';
            setTimeout(() => displayInitialCount(), 2000);
            return false;
        }
        isDownloading = true;
        isPaused = false;
        currentDownloadIndex = 0;
        // Adding a 0.5 second delay before showing progress for force download
        if (includeInteracted) {
            await new Promise(resolve => setTimeout(resolve, 500));
        }
        while (currentDownloadIndex < currentTorrents.length) {
            if (isPaused) {
                await new Promise(resolve => setTimeout(resolve, 500));
                continue;
            }
            const torrent = currentTorrents[currentDownloadIndex];
            console.log(`Downloading: ${torrent.filename}`);
            downloadFile(torrent.url, torrent.filename);
            updateButtonProgress(currentDownloadIndex + 1, currentTorrents.length);
            currentDownloadIndex++;
            await new Promise(resolve => setTimeout(resolve, 1000));
        }
        isDownloading = false;
        downloadAllButton.textContent = 'This Page is Done';
        downloadAllButton.style.backgroundColor = 'red';
        return false;
    }
    // Add Download All button with long press functionality
    function addDownloadAllButton() {
        const searchButton = document.querySelector('input[type="submit"][value="Поиск!"]');
        if (searchButton) {
            downloadAllButton = document.createElement('button');
            downloadAllButton.textContent = 'Download All';
            downloadAllButton.style.marginLeft = '10px';
            downloadAllButton.classList.add('btn', 'btn-success');
            let longPressActivated = false;
            // Short press - download non-interacted torrents or pause/resume
            downloadAllButton.addEventListener('click', (e) => {
                e.preventDefault();
                e.stopPropagation();
                if (!longPressActivated) downloadAllTorrents(e, false);
                return false;
            });
            // Long press handling
            downloadAllButton.addEventListener('mousedown', (e) => {
                e.preventDefault();
                e.stopPropagation();
                let progress = 0;
                longPressActivated = false;
                // Delay text change by 0.5s
                textChangeTimer = setTimeout(() => {
                    downloadAllButton.textContent = 'Force Download All';
                    downloadAllButton.style.background = 'linear-gradient(to right, #FFD700 0%, #28a745 0%)';
                    downloadAllButton.style.color = 'black';
                }, textChangeDelay);
                longPressTimer = setInterval(() => {
                    progress += 100 / (longPressDuration / 100);
                    downloadAllButton.style.background = `linear-gradient(to right, #FFD700 ${progress}%, #28a745 ${progress}%)`;
                    if (progress >= 100) {
                        clearInterval(longPressTimer);
                        clearTimeout(textChangeTimer);
                        longPressTimer = null;
                        textChangeTimer = null;
                        longPressActivated = true;
                        downloadAllTorrents(new Event('click'), true);
                    }
                }, 100);
            });
            downloadAllButton.addEventListener('mouseup', (e) => {
                e.preventDefault();
                e.stopPropagation();
                if (longPressTimer) {
                    clearInterval(longPressTimer);
                    longPressTimer = null;
                }
                if (textChangeTimer) {
                    clearTimeout(textChangeTimer);
                    textChangeTimer = null;
                }
                // Only reset button if not downloading or paused
                if (!isDownloading && !isPaused) {
                    displayInitialCount();
                    downloadAllButton.style.background = '';
                    downloadAllButton.style.color = '';
                }
            });
            downloadAllButton.addEventListener('mouseleave', (e) => {
                e.preventDefault();
                e.stopPropagation();
                if (longPressTimer) {
                    clearInterval(longPressTimer);
                    longPressTimer = null;
                }
                if (textChangeTimer) {
                    clearTimeout(textChangeTimer);
                    textChangeTimer = null;
                }
                // Prevent reset on hover if paused or downloading
                if (!isDownloading && !isPaused) {
                    displayInitialCount();
                    downloadAllButton.style.background = '';
                    downloadAllButton.style.color = '';
                }
            });
            searchButton.parentNode.insertBefore(downloadAllButton, searchButton.nextSibling);
            displayInitialCount();
        } else {
            console.error('Download All button could not be added. Search button not found.');
        }
    }
    // Initialize script
    window.addEventListener('load', () => {
        addDownloadAllButton();
        console.log('TeamHD Torrent Downloader script initialized.');
    });
})();
[Профиль]  [ЛС] 

БэстЛайв

Стаж: 15 лет 3 месяца

Сообщений: 987

БэстЛайв · 25-Фев-25 15:52 (спустя 1 день 14 часов, ред. 25-Фев-25 15:52)

oi писал(а):
87440502TeamHD One Click Torrent Downloader
Добавляет кнопку "Download All" на сайт teamhd.org для массовой загрузки .torrent файлов со страницы поиска.
Обычное нажатие загружает только .torrent файлы, с которыми нет активного взаимодействия (раздача/загрузка).
Долгое нажатие (3 секунды) включает режим "Force Download All", позволяя скачать все .torrent файлы, включая те, что в активной закачке/раздаче.
Кнопка отображает количество доступных файлов и показывает прогресс загрузки.
Есть возможность поставить на паузу и возобновить загрузку при повторном нажатии на кнопку.
Загрузка происходит раз в секунду чтобы не напрягать сервер большими выгрузками.
гифка
Правила TeamHD
Цитата:
3.6 Запрещено "коллекционирование" торрент-файлов, т.е. скачивание торрент-файлов "про запас" без фактической загрузки раздачи. Используйте систему закладок. Несоблюдение - предупреждение на 2 недели, в особых случаях - бан.
Хороший скрипт, скачал все торренты и в бан
[Профиль]  [ЛС] 

oi

Стаж: 17 лет 5 месяцев

Сообщений: 584

oi · 25-Фев-25 20:53 (спустя 5 часов)

БэстЛайв писал(а):
Хороший скрипт, скачал все торренты и в бан
Для этого скрипт не нужен, на странице поиска ссылки на торрент файлы и так доступны. Есть 100500 екстеншенов которые их смогут выкачать и так.
[Профиль]  [ЛС] 

Кантор-Эль драко

Top Loader 05* 2TB

Стаж: 15 лет 9 месяцев

Сообщений: 1821

Кантор-Эль драко · 25-Фев-25 21:33 (спустя 40 мин.)

Цитата:
скачал все торренты
И выложил в паблик.
[Профиль]  [ЛС] 

exiless

Стаж: 1 год 8 месяцев

Сообщений: 41

exiless · 22-Апр-25 20:22 (спустя 1 месяц 24 дня)

1dNDN писал(а):
85994224https://gist.github.com/1dNDN/15680715cfcc7fd00f50206d19ec24c9
Написал автозаполнение полей в форме создания новой раздачи игры из steam и mobigames
скрипт написал - а разъяснения - нет..
[Профиль]  [ЛС] 

qweqwe876

Стаж: 13 лет 8 месяцев

Сообщений: 6


qweqwe876 · 29-Апр-25 18:42 (спустя 6 дней)

copyMister писал(а):
85726669RuTracker Full-Text Search in Topics v1.4
Картинка
Добавляет возможность искать текст на всех страницах темы.
Мой вариант скрипта Search text in thread a.k.a. Поиск текста по сообщениям темы (№13).
скрытый текст
Чем лучше:
- найденный текст подсвечивается, есть индикатор прогресса
- в результатах работают спойлеры, YouTube-видео, ссылки в цитатах и т.д.
- при повторном поиске без перезагрузки страницы результаты выдаются почти мгновенно (запросы второй раз не отсылаются)
- запросы асинхронные, так что браузер не должен подвисать даже в 100-страничных темах
- добавлена горячая клавиша для быстрого фокуса в поле: Alt+ф (Chrome), Alt+Shift+ф (Firefox) или Ctrl+Opt+ф (Mac)
- добавлены настройки: искать в том числе по никам пользователей, сортировать сообщения по убыванию даты
- код оптимизирован, без jQuery
Установить:
- Greasy Fork
Проверено в Chrome и Firefox с расширениями Tampermonkey и Violentmonkey.
В Greasemonkey не работает, потому что там нет функции GM_addStyle (зачем-то удалили). Нет желания возиться с этим расширением, так что рекомендую два других.
copyMister, подскажите, что я делаю неверно? установил Tampermonkey и скачал скрипт. в расширении отображается что скрипт мол установлен. но никакого поиска я не наблюдаю(
[Профиль]  [ЛС] 

copyMister

Top Bonus 05* 10TB

Стаж: 15 лет 11 месяцев

Сообщений: 240

copyMister · 29-Апр-25 18:51 (спустя 9 мин.)

qweqwe876
Возможно, поможет включение "Режима разработчика" в настройках расширений (справа вверху), если браузер - Chrome или подобный.
Если нет, то можно попробовать другое расширение - Violentmonkey. Оно еще и с открытым кодом.
[Профиль]  [ЛС] 

stаlkerok

Стаж: 2 года 7 месяцев

Сообщений: 2925

stаlkerok · 02-Июн-25 16:08 (спустя 1 месяц 2 дня)

Может, кто-нибудь возьмется? https://rutr.life/forum/viewtopic.php?p=87762515#87762515
[Профиль]  [ЛС] 

RewTeyi

Стаж: 3 года 4 месяца

Сообщений: 527

RewTeyi · 04-Июн-25 00:04 (спустя 1 день 7 часов)

Есть у кого правленная версия FastPic Upload?
Загрузка на new fastpic выдает undefined
[IMG]undefined[/IMG]
[Профиль]  [ЛС] 

x86-64

Moderator senior

Стаж: 7 лет 3 месяца

Сообщений: 28816

x86-64 · 02-Сен-25 17:25 (спустя 2 месяца 28 дней, ред. 04-Сен-25 13:22)

добавлю парочку скриптов для нашего трекера
кнопка [Код] сразу его копирует
Код:
// ==UserScript==
// @name         Rutracker Code Copy
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Копирует содержимое блока кода по нажатию на кнопку [Код] на Rutracker
// @author       Мосгортранс
// @match        https://rutr.life/forum/viewtopic.php*
// @grant        unsafeWindow
// @run-at       document-end
// ==/UserScript==
(function() {
    'use strict';
    const EXCLUSION_TIMEOUT = 5000;
    const activeRequests = new Set();
    async function copyToClipboard(text) {
        try {
            await navigator.clipboard.writeText(text);
            return true;
        } catch (err) {
            console.error('Ошибка копирования:', err);
            return false;
        }
    }
    function showNotification(message, isError = false) {
        const existing = document.querySelector('.rtcc-notification');
        if (existing) existing.remove();
        const notification = document.createElement('div');
        notification.className = 'rtcc-notification';
        Object.assign(notification.style, {
            position: 'fixed',
            right: '20px',
            top: '20px',
            padding: '12px 20px',
            background: isError ? '#e74c3c' : '#2ecc71',
            color: 'white',
            borderRadius: '4px',
            fontSize: '14px',
            fontWeight: '500',
            boxShadow: '0 3px 6px rgba(0,0,0,0.16)',
            zIndex: 10000,
            transition: 'opacity 0.3s, transform 0.3s',
            opacity: '0',
            transform: 'translateX(120%)'
        });
        notification.textContent = message;
        document.body.appendChild(notification);
        requestAnimationFrame(() => {
            notification.style.transform = 'translateX(0)';
            notification.style.opacity = '1';
        });
        setTimeout(() => {
            notification.style.opacity = '0';
            notification.style.transform = 'translateX(120%)';
            setTimeout(() => notification.remove(), 300);
        }, 3000);
    }
    function handleCodeRequest(postId) {
        if (activeRequests.has(postId)) return;
        activeRequests.add(postId);
        const targetId = `ptx-${postId}`;
        let observer = null;
        let timeout = null;
        function cleanup() {
            activeRequests.delete(postId);
            if (observer) observer.disconnect();
            if (timeout) clearTimeout(timeout);
        }
        const checkExisting = () => {
            const textarea = document.getElementById(targetId);
            if (textarea && textarea.tagName === 'TEXTAREA') {
                copyToClipboard(textarea.value)
                    .then(success => {
                        showNotification(success ? 'Код скопирован' : 'Ошибка копирования', !success);
                        cleanup();
                    });
                return true;
            }
            return false;
        };
        if (checkExisting()) return;
        unsafeWindow.ajax.view_post(postId);
        observer = new MutationObserver(mutations => {
            for (const mutation of mutations) {
                for (const node of mutation.addedNodes) {
                    if (node.id === targetId || node.querySelector?.('#' + targetId)) {
                        if (checkExisting()) return;
                    }
                }
            }
        });
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
        timeout = setTimeout(() => {
            showNotification('Превышено время ожидания', true);
            cleanup();
        }, 8000);
    }
    document.addEventListener('click', event => {
        const target = event.target.closest('.txtb');
        if (target && target.textContent.trim() === '[Код]') {
            const onclick = target.getAttribute('onclick') || '';
            const match = onclick.match(/ajax\.view_post\(['"]?(\d+)['"]?\)/);
            if (match?.[1]) {
                event.preventDefault();
                event.stopPropagation();
                handleCodeRequest(match[1]);
            }
        }
    }, true);
    document.addEventListener('click', event => {
        if (event.target.closest('.txtb[onclick*="view_post"]')) {
            event.stopImmediatePropagation();
        }
    }, true);
})();
кнопка ''открыть непрочитанные'' мгновенно открывает последние страницы всех тем, а не только первые 20 и с долгими паузами (очень удобно)
Код:
// ==UserScript==
// @name         Rutracker Unread Topics Opener
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Делает бесполезную кнопку полезной
// @author       Мосгортранс
// @match        https://rutr.life/forum/search.php?uid=*
// @grant        none
// ==/UserScript==
(function() {
    'use strict';
    function initScript() {
        const targetButton = document.querySelector('li.a-like.med.normal.open-all-unread-topics');
        if (!targetButton) return false;
        if (targetButton.classList.contains('modified-by-script')) return true;
        targetButton.classList.add('modified-by-script');
        const newButton = targetButton.cloneNode(true);
        targetButton.parentNode.replaceChild(newButton, targetButton);
        newButton.onclick = function(e) {
            e.preventDefault();
            e.stopPropagation();
            e.stopImmediatePropagation();
            const tableBody = document.querySelector('tbody[aria-live="polite"][aria-relevant="all"]');
            if (!tableBody) {
                alert('Не удалось найти таблицу с темами');
                return;
            }
            const unreadRows = tableBody.querySelectorAll('tr:has(a.t-is-unread)');
            if (unreadRows.length === 0) {
                alert('Непрочитанных тем не найдено');
                return;
            }
            console.log(`Найдено ${unreadRows.length} непрочитанных тем`);
            unreadRows.forEach(row => {
                const pagination = row.querySelector('.topicPG');
                if (!pagination) return;
                const links = pagination.querySelectorAll('a');
                if (links.length === 0) return;
                const lastPageLink = links[links.length - 1];
                const url = lastPageLink.href;
                window.open(url, '_blank');
            });
        };
        newButton.textContent = 'Открыть непрочитанные';
        newButton.style.color = '#ff9900';
        newButton.style.fontWeight = 'bold';
        newButton.style.cursor = 'pointer';
        newButton.removeAttribute('title');
        return true;
    }
    if (!initScript()) {
        const observer = new MutationObserver(function(mutations) {
            for (let mutation of mutations) {
                if (mutation.addedNodes.length) {
                    if (initScript()) {
                        observer.disconnect();
                        break;
                    }
                }
            }
        });
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
        setTimeout(() => {
            initScript();
        }, 3000);
    }
})();
[Профиль]  [ЛС] 
 
Ответить
Loading...
Error