NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name thepiratebay helper
// @namespace darkred
// @version 2020.7.30
// @description Converts dates to local timezone on thepiratebay and optionally either highlight VIP/Trusted/Moderator/Helper torrents or hide non verified torrents altogether
// @authors emptyparad0x, darkred
// @license MIT
// @include /^https?://thepiratebay\.(org|se|gd|la|mn|vg)/(search|browse|user|recent|torrent|description\.php|tv|music|top).*$/
// @grant none
// @require https://code.jquery.com/jquery-3.2.0.min.js
// @require https://greasyfork.org/scripts/28536-gm-config/code/GM_config.js
// @require https://cdnjs.cloudflare.com/ajax/libs/keypress/2.1.4/keypress.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js
// @run-at document-idle
// @supportURL https://github.com/darkred/Userscripts/issues
// ==/UserScript==
/* global GM_config, moment */
/*
if (document.querySelector('.viewswitch > a:nth-child(1)') && document.querySelector('.viewswitch > a:nth-child(1)').outerHTML.indexOf('Single</a>') !== -1 ) {
$('body').append(`<center>In order thepiratebay helper to work, please switch the view mode of the search results to single-line <i>(click: 'Single' in the table header, and then reload the page (F5)</i>)</center>`);
throw new Error('Not in single-line view mode. The usercript exits.');
}
*/
// Customize the strings in the locale to display "1 minute ago" instead of "a minute ago" (https://github.com/moment/moment/issues/3764#issuecomment-279928245)
moment.updateLocale('en', {
relativeTime: {
future: 'in %s',
past: '%s ago',
s: 'seconds',
m: '1 minute',
mm: '%d minutes',
h: '1 hour',
hh: '%d hours',
d: '1 day',
dd: '%d days',
M: '1 month',
MM: '%d months',
y: '1 year',
yy: '%d years'
}
});
$('table td').css({ 'white-space': 'nowrap' }); // In order to prevent the text in all table cells from wrapping
$('#main-content').css({ 'overflow': 'visible' }); // Override the default rule which is 'hidden' ('#main-content' is the parent of the search results' 'table' element)
//GM_config stuff
GM_config.init('TPB Helper settings',{
// timezone: {label: 'Text for Timezone:', type: 'text', cols: 10, default: 'EST'},
// tpboffset: {label: 'TPB Timezone offset : (GMT+1) +', type: 'int', default: 0}, // Initially it was: tpboffset: { label: 'TPB Timezone: GMT+', type: 'int', default: 1 },
enhanceVisibility: {label: 'Show all / Highlight trusted / Hide non-trusted:', section: ['Extras'], type: 'select', options: ['Show all', 'Highlight','Hide'], default: 'Show all'},
keepNonTrustedWithComments: {label: '...when toggle, include those non-trusted which have comments:', type: 'checkbox', default: true},
relativeDates: {label: 'Display torrent timestamps in relative format:', type: 'checkbox', default: true},
// swapVerifiedIconsWithComments: {label: 'Swap the verified icons with the Comments icon:', type: 'checkbox', default: true},
RtColumn: {label: 'Add a Ratio column?', type: 'checkbox', default: true}
},{
save: function(){location.reload();}
});
$('footer').append(`<center><a id='TimeChangerConfig'>TPB Helper settings</a></center>`);
$('#TimeChangerConfig').click(function(){GM_config.open();}).css({'cursor': 'pointer'});
// var timezone = GM_config.get('timezone');
// var tpboffset = GM_config.get('tpboffset');
var enhanceVisibility = GM_config.get('enhanceVisibility');
var keepNonTrustedWithComments = GM_config.get('keepNonTrustedWithComments');
var relativeDates = GM_config.get('relativeDates');
var RtColumn = GM_config.get('RtColumn');
// var swapVerifiedIconsWithCommentsChoice = GM_config.get('swapVerifiedIconsWithComments');
// For the Ratio column
function appendColumn() {
var se, le, ratio;
if (document.querySelector('span.list-header:nth-child(7)')){
document.querySelector('span.list-header:nth-child(7)').insertAdjacentHTML('afterend', '<span class="list-item list-header item-seed"><label onclick="sortlist(7);" title="Seeds/Peers">Rt</label></span>');
}
var entries = document.querySelectorAll('li.list-entry > span:nth-child(7)');
for (var i = 0; i < entries.length; i++) {
se = parseInt(entries[i].previousElementSibling.innerHTML); // Retrieve the content of the cell of the SE column and store it to variable se
le = parseInt(entries[i].innerHTML); // Retrieve the content of the cell of the LE column and store it to variable le
if (se > 0 && le === 0){
ratio = se;
} else if (se === 0 || le === 0){
ratio = 0;
} else {
ratio = se/le;
}
// ratio = (Math.round(10 * ratio) / 10);
ratio = ratio.toFixed(1);
entries[i].insertAdjacentHTML('afterend', '<span>' + ratio + '</span>');
entries[i].nextSibling.className = 'list-item item-ratio';
$('.item-ratio').css('text-align', 'right');
}
}
if (RtColumn === true) {
appendColumn();
$('.list-item:last-child').css('text-align', 'right'); // Select all Ratio values (=all last cells of all rows) and align them to the right
}
/*
if (swapVerifiedIconsWithCommentsChoice === true) {
swapVerifiedIconsWithComments();
}
*/
//Check page
var url = window.location.href;
var host = window.location.host;
// if (url.indexOf(host + '/torrent/') !== -1) { // if current is a torrent page
if (url.indexOf(host + '/description.php') !== -1) { // if current is a torrent page
if (relativeDates === true) {
convertDatesInTorrentPage();
}
} else { // if current is search results
// Enhance trusted torrents
if (enhanceVisibility === 'Highlight') {
highlight();
}
// Hide non trusted torrents
var counter = 0;
if (enhanceVisibility === 'Hide') {
hideNonTrusted(); // the value of 'counter' increases inside the hideNonTrusted function execution
if (counter > 0) {
document.querySelector('#TimeChangerConfig').insertAdjacentHTML('afterend', '<br><i>' + counter + ' non verified torrents hidden <br/> click here (or press `) to view all torrents with comments, <br/> or press ~ to view all</i>');
}
var flagHide = true;
$('#TimeChangerConfig').nextAll().eq(1).on('click', toggleHide);
var listener1 = new window.keypress.Listener();
listener1.simple_combo('`', function() {
toggleHide();
});
var listener2 = new window.keypress.Listener();
listener2.simple_combo('~', function() {
$(getAllTableLines()).each(function() {
$(this).show();
});
$('#TimeChangerConfig').nextAll().eq(1).html('<i>click here (or press `) to view only verified torrents</i>');
// if (swapVerifiedIconsWithCommentsChoice === true) {
// restoreCommentIconsPosition();
// }
});
}
}
function toggleHide() {
if (counter > 0) {
$(getAllTableLines()).each(function() {
$(this).show();
});
// if (swapVerifiedIconsWithCommentsChoice === true) {
// swapVerifiedIconsWithComments();
// }
if (flagHide === true) {
if (keepNonTrustedWithComments === true){
hideNonTrustedAndWithoutComments();
} else {
hideNonTrusted();
}
$('#TimeChangerConfig').nextAll().eq(1).html('<i>' + $('tbody > tr[style="display: none;"]').length + ' torrents without comments hidden <br/> click here (or press `) to view only verified torrents <br/> or press ~ to view all</i>');
flagHide = false;
} else {
counter = 0;
hideNonTrusted();
$('#TimeChangerConfig').nextAll().eq(1).html('<i>' + counter + ' non verified torrents hidden <br/> click here (or press `) to view all torrents with comments, <br/> or press ~ to view all</i>');
flagHide = true;
}
}
}
function getAllTableLines(){
if ( ($('#searchResult > tbody > tr:last-child td a:last-child img').attr('alt') === 'Next')) { // if there's a Next button, i.e. the search results are multi plage
// return $('table#searchResult tbody tr').not('#searchResult > tbody > tr:last-child'); // then ignore the last row of the table (the navigation links)
} else {
// return $('table#searchResult tbody tr');
return $('#torrents > .list-entry');
}
}
function swapVerifiedIconsWithComments(){
// in order to swap the verified icons position with that of the comments
$( '[title ~= "comments."]' ).each(function() {
if (($(this).parent().parent().html().indexOf('alt="VIP"') > -1) ||
($(this).parent().parent().html().indexOf('alt="Trusted"') > -1) ||
($(this).parent().parent().html().indexOf('alt="Super Mod"') > -1) ||
($(this).parent().parent().html().indexOf('Helper') > -1) ) {
$(this).parent().children().last().insertBefore($(this));
}
});
// // in order to move the verified icons before each uploader handle
// $('img[alt="VIP"], img[alt="Trusted"], img[alt="Super Mod"], img[alt="Helper"]').each(function() {
// $(this).insertBefore($(this).parent().parent().parent().parent().children().last().children().first());
// // $(this).insertAfter($(this).parent().parent().parent().parent().children().last().children().first());
// });
}
// function restoreCommentIconsPosition(){
// $( '[title ~= "comments."]' ).each(function() {
// if (($(this).prev().html().indexOf('alt="VIP"') > -1) ||
// ($(this).prev().html().indexOf('alt="Trusted"') > -1) ||
// ($(this).prev().html().indexOf('alt="Super Mod"') > -1) ||
// ($(this).prev().html().indexOf('Helper') > -1) ) {
// $(this).prev().insertAfter($(this));
// }
// });
// }
function hideNonTrusted() {
$(getAllTableLines()).each(function() {
if (($(this).html().indexOf('alt="VIP"') === -1) &&
($(this).html().indexOf('alt="Trusted"') === -1) && ($(this).html().indexOf('alt="Super Mod"') === -1) &&
($(this).html().indexOf('Helper') === -1) ){
$(this).hide();
counter++;
}
});
}
function hideNonTrustedAndWithoutComments() {
$(getAllTableLines()).each(function() {
if (($(this).html().indexOf('alt="VIP"') === -1) &&
($(this).html().indexOf('alt="Trusted"') === -1) &&
($(this).html().indexOf('alt="Super Mod"') === -1) &&
($(this).html().indexOf('Helper') === -1) &&
($(this).html().indexOf('icon_comment.gif') === -1) ){
$(this).hide();
counter++;
}
});
}
function highlight() {
// $('table#searchResult tbody tr').each(function() {
$(getAllTableLines()).each(function() {
if ($(this).html().indexOf('alt="VIP"') > -1) {
$(this).css({
'background-color': '#CFFECD'
});
} else if ($(this).html().indexOf('alt="Trusted"') > -1) {
$(this).css({
'background-color': '#F9D5DB'
}); // (initially it was FECDFE) and then FECDD9
} else if ($(this).html().indexOf('alt="Super Mod"') > -1) {
$(this).css({
'background-color': '#DCDCDC'
});
} else if ($(this).html().indexOf('Helper') > -1) { // Extra line
$(this).css({
'background-color': '#33CCCC'
});
} else if ($(this).html().indexOf('src="https://piratebay.org/img/next.gif"') > -1) {
//do nothing
} else {
$(this).css({
'opacity': '0.5'
});
$(this).css({
'background-color': 'white'
});
}
});
}
// 2020-07-30
function convertDates() {
// alert();
// var dates = document.querySelectorAll('#searchResult > tbody > tr > td:nth-child(3)');
var dates = document.querySelectorAll('#st > span.list-item.item-uploaded');
for (var i = 0; i < dates.length; i++) {
if (dates[i].title === '' ) { // if it's the 1st time the function is called
var initial = dates[i].innerHTML.replace(/ /g, ' ').replace(/<\/?b>/g, '');
} else { // else (in consequent calls)
initial = dates[i].title;
}
var temp = initial.trim(); // remove trailing spaces
var today = moment().format('YYYY-MM-DD');
if (temp === today) {
dates[i].title = initial;
dates[i].innerHTML = 'Today';
} else {
temp = moment(temp, 'YYYY-MM-DD', true);
dates[i].innerHTML = temp.fromNow();
// dates[i].setAttribute('relative', 'true');
dates[i].title = temp.format('YYYY-MM-DD');
}
}
}
/*
if (relativeDates === true) {
// recalculate the timestamps in relative format every 10 sec
(function(){
convertDates();
setTimeout(arguments.callee, 1 * 10 * 1000);
})();
}
*/
convertDates();
function convertDatesInTorrentPage(){
var torrentTimestamp = document.querySelector('#uld');
var initial = torrentTimestamp.innerHTML;
var today = moment().format('YYYY-MM-DD');
if (initial === today) {
torrentTimestamp.title = initial;
torrentTimestamp.innerHTML = 'Today';
} else {
torrentTimestamp.innerHTML = moment(initial, 'YYYY-MM-DD', true).fromNow();
torrentTimestamp.title = initial;
}
// FOR THE COMMENT TIMESTAMPS ----> Currently as of 7/30/20 "Currently, you can't comments in TPB torrents. (https://pirates-forum.org/Thread-TPB-comments-new-account?pid=301381#pid301381) "
var dates = document.querySelectorAll('#comments > div[id^="comment-"] > p');
for (var i = 0; i < dates.length; i++) {
// example: 2016-11-23 17:53 CET
var currentElement = dates[i].childNodes[2];
initial = currentElement.nodeValue.trim().replace('at ', '').slice(0, -1);
currentElement.parentElement.title = initial;
}
}