1337X - convert torrent timestamps to relative format

Converts torrent upload timestamps to relative format

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        1337X - convert torrent timestamps to relative format
// @namespace   darkred
// @version     2021.7.14.1
// @description Converts torrent upload timestamps to relative format
// @author      darkred
// @license     MIT
// @include     /^https:\/\/(www\.)?1337x\.(to|st|ws|eu|se|is|gd|unblocked\.dk)((?!\/torrent)).*$/
// @grant       none
// @require     https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js
// @require     https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.31/moment-timezone-with-data-10-year-range.min.js
// @supportURL  https://github.com/darkred/Userscripts/issues
// ==/UserScript==

// Official mirrors list: https://1337x.to/about

'use strict';
/* global moment */





// 11:59am         ---> h:hha
// 10am Oct. 30th  ---> haA MMM. Do
// 11pm Nov. 4th
// Oct. 31st '20



// Based on the timestamp on the footer of each RARBG page --> "Sat, 01 May 2020 20:14:56 +0200",
// the script takes that the server time is GMT+2 and that it doesn't take DST.
// Also, the script uses the 'moment-timezone' library as it takes DST offsets into account when converting the timestamps to user/local timezone.

// This is no typo:
// const serverTimezone = 'Etc/GMT+2';  	// -02:00	-02:00  (=no DST)
// const serverTimezone = 'Etc/GMT-2';  		// +02:00	+02:00  (=no DST)
const serverTimezone = 'Etc/GMT-1';  		// +01:00	+01:00  (=no DST)

// const serverTimezone = 'Etc/GMT-1';

const localTimezone = moment.tz.guess();    // In my case ----> +02:00	+03:00  (DST)

// const format = 'MM/DD/YYYY HH:mm:ss';
// const format = 'YYYY-MM-DD HH:mm:ss';
moment.locale('en');
const format = ['h:mma', 'ha MMM. Do', 'MMM. Do \'YY'];
const formatTooltip1 = 'h:mma'; 		// the 1st element of the above array.
const formatTooltip2 = 'ha MMM. Do';	// the 2st element of the array (there can be no 3rd format, e.g. Oct. 31st '20 is only date, not time ).

// 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'
	}
});


function convertToLocalTimezone(timestamps) {
	for (let i = 0; i < timestamps.length; i++) {
		let initialTimestamp = timestamps[i].textContent;
		if (moment(initialTimestamp, format, true).isValid()) {		// As of moment.js v2.3.0, you may specify a boolean for the last argument to make Moment use strict parsing. Strict parsing requires that the format and input match exactly, including delimeters.
			let convertedToLocalTimezone = moment.tz(initialTimestamp, format, serverTimezone).tz(localTimezone);
			timestamps[i].textContent = convertedToLocalTimezone.fromNow();

			// timestamps[i].title = initialTimestamp;
			if (moment(initialTimestamp, formatTooltip1, true).isValid()) {
				timestamps[i].title = convertedToLocalTimezone.format(formatTooltip1);
			} else if (moment(initialTimestamp, formatTooltip2, true).isValid()) {
				timestamps[i].title = convertedToLocalTimezone.format(formatTooltip2);
				// timestamps[i].title = convertedToLocalTimezone.toISOString();	// Display timestamps in tooltips in ISO 8601 format, combining date and time  (https://stackoverflow.com/questions/25725019/how-do-i-format-a-date-as-iso-8601-in-moment-js/)
			}
		}
	}


	// recalculate the relative dates every 1 min
	(function(){
		for (let i = 0; i < timestamps.length; i++) {
			// timestamps[i].textContent = moment(timestamps[i].title).fromNow();

			if (timestamps[i].title !== '') {
				let tooltipValue = timestamps[i].title;
				let convertedToLocalTimezone = moment(tooltipValue, format); // no need to reconvert, it's already in local timezone
				timestamps[i].textContent = convertedToLocalTimezone.fromNow();
			}

		}
		// setTimeout(arguments.callee, 10 * 1000); 	// 10 * 1000 msec = 10 sec = 1/6 min
		setTimeout(arguments.callee, 60 * 1000); 	// 60 * 1000 msec = 1 min
	})();


}

// const timestamps = document.querySelectorAll('tr.lista2 td:nth-child(3)');
const timestamps = document.querySelectorAll('tbody .coll-date');
convertToLocalTimezone(timestamps);