// ==UserScript==
// @name Torrenter
// @namespace http://www.google.com/search?q=mabakay
// @version 2.0.0
// @description Adds links to torrent sites on popular movie websites.
// @description:pl Dodaje linki do stron z torrentami na popularnych stronach o filmach.
// @author mabakay
// @copyright 2010 - 2021, mabakay
// @date 04 November 2021
// @license MIT
// @run-at document-end
// @icon64URL https://raw.githubusercontent.com/mabakay/torrenter/master/torrenter_64.png
// @supportURL https://github.com/mabakay/torrenter
// @match http://www.filmweb.pl/*
// @match https://www.filmweb.pl/*
// @match http://release24.pl/*
// @match https://release24.pl/*
// @match http://www.imdb.com/*
// @match https://www.imdb.com/*
// @match http://www.rottentomatoes.com/*
// @match https://www.rottentomatoes.com/*
// @require https://openuserjs.org/src/libs/sizzle/GM_config.min.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// ==/UserScript==
'use strict';
var TorrenterConfigurator = /** @class */ (function () {
function TorrenterConfigurator(language, changeCallback) {
var _this = this;
this._language = language;
if (!GM_config || !GM_registerMenuCommand) {
return;
}
var gmConfiguration = {
'id': 'mabakay_Torrenter',
'title': this.localization.settingsTitle,
'fields': {
'showEngines': {
'label': this.localization.showBuildInEngines,
'type': 'checkbox',
'default': true
},
'showUserEngines': {
'label': this.localization.showUserEngines,
'type': 'checkbox',
'default': false
},
'showUserEnginesFirst': {
'label': this.localization.showUserEnginesFirst,
'type': 'checkbox',
'default': false
},
'userEngines': {
'label': this.localization.userEngines,
'type': 'textarea',
'default': '',
}
},
'events': {
'open': function (document, window, frame) {
var userEnginesFiled = document.getElementById('mabakay_Torrenter_field_userEngines');
userEnginesFiled.setAttribute('cols', '80');
userEnginesFiled.setAttribute('rows', '10');
userEnginesFiled.setAttribute('placeholder', _this.localization.eg + ' https://search-site.com/?title={title}&year={year}&orderby=seeds');
var enginesFieldDescription = document.createElement("div");
enginesFieldDescription.setAttribute('style', 'font-size: 12px;margin: 5px 6px;color: gray;');
enginesFieldDescription.innerHTML = _this.localization.addEngineDescription;
var enginesLabelField = document.getElementById('mabakay_Torrenter_userEngines_field_label');
enginesLabelField.after(enginesFieldDescription);
var saveButton = document.getElementById('mabakay_Torrenter_saveBtn');
saveButton.textContent = _this.localization.saveButtonCaption;
var closeButton = document.getElementById('mabakay_Torrenter_closeBtn');
closeButton.textContent = _this.localization.closeCaptionButton;
var restToDefaultsLink = document.getElementById('mabakay_Torrenter_resetLink');
restToDefaultsLink.textContent = _this.localization.resetLinkCaption;
GM_config.frame.setAttribute('style', 'inset: 166px auto auto 326px;border: 1px solid rgb(0, 0, 0);height: 410px;margin: 0px;opacity: 1;overflow: auto;padding: 0px;position: fixed;width: 650px;z-index: 9999;display: block;');
},
'save': function () {
GM_config.close();
if (changeCallback) {
changeCallback();
}
}
}
};
GM_config.init(gmConfiguration);
GM_registerMenuCommand(this.localization.configureMenuItem, function () { GM_config.open(); });
}
Object.defineProperty(TorrenterConfigurator.prototype, "localization", {
get: function () {
if (!TorrenterConfigurator._localization.hasOwnProperty(this._language)) {
return TorrenterConfigurator._localization['en'];
}
return TorrenterConfigurator._localization[this._language];
},
enumerable: false,
configurable: true
});
TorrenterConfigurator.prototype.getConfigurationProperty = function (name, defaultValue) {
var _a;
try {
return (_a = GM_config.get(name)) !== null && _a !== void 0 ? _a : defaultValue;
}
catch (_b) {
return defaultValue;
}
};
TorrenterConfigurator.getLanguage = function () {
var lang = (window.navigator.languages ? window.navigator.languages[0] : window.navigator.language).toLowerCase();
if (lang.indexOf('-') !== -1)
lang = lang.split('-')[0];
if (lang.indexOf('_') !== -1)
lang = lang.split('_')[0];
return lang;
};
TorrenterConfigurator.prototype.getConfiguration = function () {
return {
engines: [
"https://thepiratebay10.org/search/{title} {year}/0/7/0",
"https://rarbg.to/torrents.php?search={title} {year}&order=seeders&by=DESC",
"https://1337x.to/sort-search/{title} {year}/seeders/desc/1/",
"https://torrentz2eu.org/index.html?q={title} {year}",
"https://yts.mx/browse-movies/{title}/all/all/0/seeds/{year}/all",
"https://eztv.re/search/{title} {year}",
"https://zooqle.com/search?q={title} {year}&s=ns&v=t&sd=d",
"https://www.torrentdownloads.me/search/?new=1&s_cat=0&search={title} {year}",
"https://www.limetorrents.pro/search/all/{title} {year}/seeds/1/"
],
showEngines: this.getConfigurationProperty('showEngines', true),
showUserEngines: this.getConfigurationProperty('showUserEngines', false),
showUserEnginesFirst: this.getConfigurationProperty('showUserEnginesFirst', false),
userEngines: this.getConfigurationProperty('userEngines', '').split(/\r?\n/).filter(function (item) { return !!item; }),
};
};
;
TorrenterConfigurator._localization = {
en: {
settingsTitle: 'Torrenter Script Settings',
showBuildInEngines: 'Show Build-in Engines',
showUserEngines: 'Show User Definied Engines',
showUserEnginesFirst: 'Show User Definied Engines First',
userEngines: 'User Engines',
eg: 'e.g.',
addEngineDescription: 'Type by separating with an enter. Available variables are:</br> {title} - movie title</br> {year} - movie release year',
saveButtonCaption: 'Save',
closeCaptionButton: 'Close',
resetLinkCaption: 'Reset to defaults',
configureMenuItem: 'Configure'
},
pl: {
settingsTitle: 'Ustawienia skryptu Torrenter',
showBuildInEngines: 'Pokaż wyszukiwarki wbudowane',
showUserEngines: 'Pokaż wyszukiwarki użytkownika',
showUserEnginesFirst: 'Pokaż wyszukiwarki użytkownika jako pierwsze',
userEngines: 'Wyszukiwarki użytkownika',
eg: 'np.',
addEngineDescription: 'Podaj rozdzielając enterem. Dostępne zmienne to:</br> {title} - tytuł filmu</br> {year} - rok wydania filmu',
saveButtonCaption: 'Zapisz',
closeCaptionButton: 'Anuluj',
resetLinkCaption: 'Przywróć ustawienia domyślne',
configureMenuItem: 'Skonfiguruj'
}
};
return TorrenterConfigurator;
}());
var Torrenter = /** @class */ (function () {
function Torrenter() {
}
Torrenter.prototype.apply = function (config, siteProcessor) {
var _this = this;
var torrenterElements = document.getElementsByClassName('torrenter');
if (torrenterElements && torrenterElements.length > 0) {
for (var i = torrenterElements.length - 1; i >= 0; i--) {
torrenterElements[i].remove();
}
}
setTimeout(function () { siteProcessor(function (tag, title, year, style, itemStyle) { return _this.createLinkSpan(config, tag, title, year, style, itemStyle); }); }, 250);
};
Torrenter.getSiteProcessor = function (hostName) {
switch (hostName) {
case "release24.pl":
return Torrenter.processRelease24;
case "www.filmweb.pl":
return Torrenter.processFilmweb;
case "www.imdb.com":
return Torrenter.processImdb;
case "www.rottentomatoes.com":
return Torrenter.processRottenTomatoes;
}
};
Torrenter.prototype.createLinkSpan = function (config, tag, title, year, style, itemStyle) {
var span = document.createElement(tag);
span.setAttribute("style", style);
span.classList.add("torrenter");
var engines = [];
if (config.showEngines && config.showUserEngines) {
if (config.showUserEnginesFirst) {
engines = config.userEngines.concat(config.engines);
}
else {
engines = config.engines.concat(config.userEngines);
}
}
else if (config.showEngines) {
engines = config.engines;
}
else if (config.showUserEngines) {
engines = config.userEngines;
}
for (var i = 0; i < engines.length; i++) {
var link = document.createElement("a");
link.setAttribute("href", Torrenter.format(engines[i], { title: encodeURIComponent(title), year: year }));
if (itemStyle) {
link.setAttribute("style", itemStyle);
}
var urlRegex = /(https?:\/\/)(.+?)\//;
var regexResult = engines[i].match(urlRegex);
link.innerHTML = Torrenter.getFavIconImg(regexResult[2]);
link.setAttribute("title", regexResult[2]);
if (i > 0) {
var separator = document.createElement("span");
separator.innerHTML = " | ";
span.appendChild(separator);
}
span.appendChild(link);
}
return span;
};
Torrenter.getFavIconImg = function (url) {
return '<img src="http://www.google.com/s2/favicons?domain=' + url + '" width="16px" height="16px">';
};
Torrenter.format = function (str, args) {
return str.replace(/{(\w+)}/g, function (placeholderWithDelimiters, placeholderWithoutDelimiters) { return args.hasOwnProperty(placeholderWithoutDelimiters) ? args[placeholderWithoutDelimiters] : placeholderWithDelimiters; });
};
Torrenter.processRelease24 = function (createLinkSpan) {
var titleElement = document.getElementById("mainwindow");
var loopCount = titleElement.childElementCount > 3 ? titleElement.childElementCount - 3 : 2;
for (var i = 1; i < loopCount; i++) {
var elem = titleElement.children[i];
if (elem.className === "wpis") {
var title_regex = /\"(.*)\"\s*(\(([0-9]{4})\))?/;
var match = elem.children[0].children[0].innerHTML.match(title_regex);
if (match != null) {
var title = match[1];
var titleYear = void 0;
if (match.length === 4 && match[3]) {
titleYear = match[3];
}
var span = createLinkSpan("span", title, titleYear, "margin-left: 1em; font-weight: normal;", "position: relative; top: 5px;");
elem.children[2].children[0].children[0].children[0].children[0].children[1].children[0].children[0].children[0].appendChild(span);
}
}
}
};
Torrenter.processFilmweb = function (createLinkSpan) {
var titleElement = document.querySelector(".filmCoverSection__title span");
var title;
var titleYear;
if (titleElement) {
var smallTitleElement = document.querySelector(".filmCoverSection__orginalTitle");
if (smallTitleElement) {
title = smallTitleElement.textContent;
}
else {
title = titleElement.textContent;
}
var year = document.querySelector(".filmCoverSection__year").textContent;
var yearRegexp = /([0-9]{4})/;
var match = year.match(yearRegexp);
if (match != null) {
titleYear = match[1];
}
}
var headerElement = document.querySelector('.filmCoverSection__type');
if (headerElement && title) {
headerElement.appendChild(createLinkSpan("span", title, titleYear, "margin-left: 1em; display: inline-flex;", "position: relative; top: 2px; z-index: 1;"));
}
};
Torrenter.processImdb = function (createLinkSpan) {
var style = "margin-top: 0.5em;";
var titleElement = document.querySelector('[class*="TitleHeader__TitleText"]');
var title;
var titleYear;
var hasSmallTitle = false;
if (titleElement) {
var smallTitleElement = document.querySelector('[class*="OriginalTitle__OriginalTitle"]');
if (smallTitleElement) {
style = "margin-left: 1em; display: inline-block;";
titleElement = smallTitleElement;
hasSmallTitle = true;
title = smallTitleElement.childNodes[0].nodeValue;
// Remove "Original title" prefix
var titleRegexp = /Original title: (.*)|.*/;
var titleMatch = title.match(titleRegexp);
if (titleMatch != null) {
title = titleMatch[1];
}
}
else {
title = titleElement.childNodes[0].nodeValue;
}
var yearElement = document.querySelector('[class*="TitleBlockMetaData__ListItemText"]');
if (yearElement) {
var year = yearElement.textContent;
var yearRegexp = /([0-9]{4})/;
var match = year.match(yearRegexp);
if (match != null) {
titleYear = match[1];
}
}
}
if (titleElement && title) {
if (hasSmallTitle) {
titleElement.appendChild(createLinkSpan("span", title, titleYear, style));
}
else {
titleElement.parentElement.appendChild(createLinkSpan("div", title, titleYear, style));
}
}
};
Torrenter.processRottenTomatoes = function (createLinkSpan) {
var titleElement = document.querySelector(".scoreboard__title");
var title;
var titleYear;
if (titleElement) {
title = titleElement.textContent;
var year = document.querySelector(".scoreboard__info").textContent;
var yearRegexp = /([0-9]{4})/;
var match = year.match(yearRegexp);
if (match != null) {
titleYear = match[1];
}
}
var headerElement = document.querySelector('.scoreboard__title');
if (headerElement && title) {
headerElement.appendChild(createLinkSpan("span", title, titleYear, "margin-left: 1em;font-size: 0.5em;position: relative;top: -7px;", "position: relative; top: 2px;"));
}
};
return Torrenter;
}());
var configurator = new TorrenterConfigurator(TorrenterConfigurator.getLanguage(), function () { applyFunction(configurator.getConfiguration()); });
var config = configurator.getConfiguration();
var hostName = window.location.hostname;
var siteProcessor = Torrenter.getSiteProcessor(hostName);
var applyFunction = function (config) {
if (siteProcessor) {
var torrenter = new Torrenter();
torrenter.apply(config, siteProcessor);
}
};
applyFunction(config);