Greasy Fork is available in English.
Stay signed in for real
// ==UserScript== // @match *://*/* // @name YGGTorrent infinite session // @description Stay signed in for real // @grant GM.getValue // @grant GM.setValue // @grant GM.deleteValue // @version 1.1.0 // @author KaKi87 // @license GPL-3.0-or-later // @namespace https://git.kaki87.net/KaKi87/userscripts/src/branch/master/YGGTorrentInfiniteSession // ==/UserScript== /* Copyright (C) 2020 - KaKi87 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/. */ /* * [ Function ] Get logout link * * NOTE : link not in DOM while logged out * */ const getLogout = () => document.querySelector('[href$="/user/logout"]'); /* * [ Event handler ] Delete credentials on logout * */ const createLogoutHandler = () => { const logout = getLogout(); if(!logout) return; logout.addEventListener('click', async event => { if(event.isTrusted) { event.preventDefault(); await GM.deleteValue('username'); await GM.deleteValue('password'); logout.click(); } }, true); } /* * [ Event listener ] Login callback * */ const onceLoggedIn = callback => { (function waitForLogin(){ if(getLogout()) callback(); else setTimeout(waitForLogin, 150); })(); }; /* * [ Main ] * */ document.addEventListener('readystatechange', async () => { if(document.readyState !== 'complete') return; /* * [Step #0] Misc * * Hide native ads * */ document.styleSheets[0].insertRule('.ad-alert-wrapper { display: none; }'); /* * [ Step #1 ] Smartly detect YGGTorrent website * * despite frequent domain name changes * * using regular expression * * NOTE : although this expression is pretty strict, * * it will match any "*.ygg.tld" and "*.yggtorrent.tld" * */ if(!window.location.href.match(new RegExp([ // EXPRESSION | DESIGNATION | COMMENT '^' , // start 'https:\/\/' , // protocol | http_s_ only '([^.]+\.)?' , // subdomain | optional 'ygg(torrent)?' , // domain | "ygg" or "yggtorrent" '\.[^.]+' , // extension | aka. TLD '(\/.+)?' , // path | optional '$' // end ].join('')))) return; /* * [ Step #2 ] Get login form * * NOTE : form exists in DOM while logged in * */ const form = document.querySelector('#user-login'); if(!form) return; const formUsername = form.querySelector('[type=text]'), formPassword = form.querySelector('[type=password]'); /* * [ Step #3 ] Handle login & logout * * Inherent features : * * - Save credentials on login * * - Delete credentials on logout * */ if(getLogout()) createLogoutHandler(); else onceLoggedIn(() => { GM.setValue('username', formUsername.value); GM.setValue('password', formPassword.value); createLogoutHandler(); }); /* * [Step #4 ] Auto-login * */ const username = await GM.getValue('username'), password = await GM.getValue('password'); if(username && password && !getLogout()) { formUsername.value = username; formPassword.value = password; form.querySelector('[type=submit]').click(); } });