Greasy Fork is available in English.

Torrent Utils for Torrentz

Magnet link Dwonload and Tracker List Copy for Torrentz

// ==UserScript==
// @name        Torrent Utils for Torrentz
// @author      nameForgotten
// @license     MIT
// @namespace   nameForgotten
// @match       *://*.torrentz.com/*
// @match       *://*.torrentz.eu/*
// @match       *://*.torrentz2.eu/*
// @match       *://*.torrentz2.is/*
// @match       *://*.torrentz.me/*
// @match       *://*.torrentz.ch/*
// @match       *://*.torrentz.in/*
// @version     1.3.1
// @description Magnet link Dwonload and Tracker List Copy for Torrentz
// ==/UserScript==


/*
 *  NOTE:
 *  - this script is rewritten based on <https://greasyfork.org/en/scripts/7088-torrentz>
 *  - the magnet icon is from <https://www.easyicon.net/1088532-magnet_icon.html>
 *  - the clip icon is from <https://icons8.com/icon/11864/clipboard>
 *
 */

(function() {

    var openMagnet = function(magnet_uri)
    {
        var xhr = new XMLHttpRequest();
        xhr.open('get', magnet_uri, true);
        xhr.send();
    };

    var generateMagnet = function(hash, name, trackers)
    {
        var magnet = 'magnet:?xt=urn:btih:' + hash + '&dn=' + encodeURIComponent(name).replace(/%20/g, '+');
        if(trackers)
        {
            for(var i=0; i < trackers.length; i++)
            {
                magnet = magnet + '&tr=' + encodeURIComponent(trackers[i]);
            }
        }

        return magnet;
    };

    var copyToClipBoard = function(text)
    {
        this.hiddenTextArea.value = text;
        this.hiddenTextArea.select();
        document.execCommand('copy');
    }

    var copyTrackers = function(){
        var i, tracker_list='';
        for(i=0; i < this.trackers.length; i++)
            tracker_list += this.trackers[i] + '\n';

        copyToClipBoard.call(this, tracker_list);
    }

    var copyMagnetList = function()
    {
        var checkedBoxes = document.querySelectorAll('input[class='+this.selectButtonClass+']:checked');

        var magnetList = '',i,magnet;
        for(i=0; i< checkedBoxes.length; i++)
        {
            magnetList += checkedBoxes[i].nextSibling.href + '\n';
        }

        copyToClipBoard.call(this, magnetList);

    }

    var createButtonStyle = function(){
        var styleElem = document.createElement('style');
        styleElem.appendChild(document.createTextNode(''));
        document.head.appendChild(styleElem);
        var styleSheet = styleElem.sheet;

        styleSheet.insertRule('.magnet-icon { background-size: contain; background-repeat: no-repeat; display: inline-block; padding-right: 5px; margin-bottom: -3px; }', 0);

        var magnetIcon16 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACuFBMVEUAAAAAAADTbijOZCXGUiHaiDLPaSjZfi7uqjoAAAAAAADNUiDMWCLASB3jljX2xkTppDnJVSHYdyrxrDcAAAAAAADNUR/KTB68NRjfeCr3vDz6xz/5xD/pnzTOXyLaeiq+PhoAAADOTx7KSx29PhrdZCTsfivxnTH3ujb5vjf2tzbceygAAAC+PhrHRhvKSR2/PhrcYCLqdSfmdibmdybulCv1rS3ljinOXiHceSbdeCDWaR/miCLDQhu7OhnbWiDnbiPibiPhbiPhbiPhbiPcciLMWB3bdSS2MBzVaR/PXR7bbh71kx3xbSDSUB3iYx/eZh/dZR/dZR/cZB/SVx7CQhvSXx+jGxrdcRzymR7qiB3LUBzaZxm8PBrUUxvbXRvZXBvZXBvYWxvPUhvDQxrKTRygGx3XWhnxjRX4mxP3mRTpgBbPVBnDQhnRUBjVVBfUVBfOThjCQhrISRqpMx3SShrdVhjlchL0jgz2kQv1jw3gbRLDQhjNSRTQSxPQSxPKRhaTKySZMyLQRhjZTBXSTBPRTBPhaQzyhgbqewrUXBPBPxjJQhLMQg/NQw/TRBLVRBbWRRXVRRLOQw/LQg/MQg/NRA/ZWwzVWxD/3gC+PxvFPBHIOgzIOgzIOgzKOwzRPQ3QPQ3JOwzHOgzIOgzIOgzGPA/BPBb/kwC4NhzFNQrBOhPDNQvEMwjEMwjEMwjEMwjDNgzBOxTROAC9Phu+Phq+PRm9PxzANxHBMAjBLQbBLQXBLQbBLQXBLQXBLQbBMgvAORPILAC9Pxy+Phq/PBi/Oxe+Pxu/NRG/Lwq+Kwe+KgW+Kga+LAi/MQ2+OBTEJAC9QBy+PhoAAAC+Oxe+PBjQAAC+Oxe+NhK+MxC+NBC+NxS+Pxy/NA++QyC+PhrUVBfQSxPMQg/EMwjEMwjEMwjEMwj////ugShJAAAA4HRSTlMAAAAAGXAhAAAAAAAAFaX9sR0AAAAAAAAWp////7MfAAAAAAAWqP//////jQAAAAAXqP//////1jwAAAAAAA2k///////VOgAHSh4AAABm+//////VOQAFd/W1HgAWxv/////VOQAFd/b//7MkPOz//946AAV49v////+xSvL//7cFBHj2/////+JjO+z///GNlPX/////408AFcX/////////////4k4AAABk/P/////iTQAAAAANn/3////////hTAAAAAAADnTb/P//87xBAAAAAAAAACpsh4BPEQAAAOH0ZloAAAABYktHROe2a2qTAAAAB3RJTUUH3AofFgsmwrCqaAAAARRJREFUGNNjYGBgYGRiZmFlY+fgZIAALm4eXj5+AUEhYREwX1RMXEJSSlpGVk5eAcRXVFJWUVVT19DU0tbRBQno6RsYGhmbmJqZW1haWdswMNja2Ts4Ojm7uLq5e3h6efsw+Pr5BwQGBYeEhoVHREZFxzDExsUnJCYlp6SmpWdkZmXnMOTm5T8oKCwqLiktK6+orKpmqKmte1jf0NjU3NLa1t7R2cXQ3dP7qK9/wsRJk6dMnTZ9xkyGWbPnzJ03f8HCRYuXLF22fMVKhlWr16xd9/jJ02frN2zctHnLVoZt23fs3LV7z959+w8cPHT4CAPD0WPHT5w8dfrM2XPnL1y8BHT65StXr12/cfPW7Tt3790H8gHz9mfGxqY+bAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNi0yOFQyMTozMTowNCswODowMILqYb8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTItMTAtMzFUMjI6MTE6MzgrMDg6MDBqS3vTAAAAQ3RFWHRzb2Z0d2FyZQAvdXNyL2xvY2FsL2ltYWdlbWFnaWNrL3NoYXJlL2RvYy9JbWFnZU1hZ2ljay03Ly9pbmRleC5odG1svbV5CgAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABd0RVh0VGh1bWI6OkltYWdlOjpIZWlnaHQANDiHYIctAAAAFnRFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADQ4f89HoAAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxMzUxNjkyNjk4DNs50gAAABF0RVh0VGh1bWI6OlNpemUAMjM4OUIUAPMPAAAAYnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L25ld3NpdGUvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL3NyYy8xMDg4NS8xMDg4NTMyLnBuZ24eJgcAAAAASUVORK5CYII=';
        var magnetIcon24 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH3AofFgsmwrCqaAAABYRJREFUSMeNVU1sXFcV/u7Pe+++8XjG49jNeOyxYzulhEqlRFRtCk0UR1GUAhXd0VIJIVR1AURi0Yh204BIJQQkdEEtoTYtKxBIoAqkql24rRtBQoqKaEmKapqmyHHG8cx4PH/v595zurATJ5Gd8Elnda++75zvnnOuwE0ws7uE/81exo7HRtG5FJczRXP78tmVv2aKJlJGYtcfP8atIG9GPj9bw45Hylj5sD0+vG9weuLRkd8NTw3+YP6NJZO2LP728NgtBdRm5LWFGON7+tGuJOPlA4PT5amBg9li0BP0e/eZgmfPv7J4pqcY2CfuKuCFDxr/v8DM7hLqiwmGJjJoVeKJ8pcK0+X9Ww54RsC1LUxe+WbQ3xX0efb8q9Uz4YBnH9+Rx4sfrtxaYGZ3CY1qiuJYiE7TTg5PZp4vjocHvIIECwbIgRIHk5NeOODtCnsVVd5t/j3Ia3tibmMBeS35ct2iWDZoN+1kacw8P7TNHKCuRev9Fmw1AtIUSBPYZgzTw5mwoL6duc0vKn/Tp4S4Qr5YSTC2zaDdpsmhEX+6OBrsdxqwDgAzVK9CZrsHLydBjlE9Fy8v/KP71OJ73Rd6RzzrYr5KOjV78foK7vmCQXl0jbzkTxeHvP0pEeLIwaUOzhKSWorWuQhxJcLSe53l+dPtwzO/X/h1uEVb12HsfTaPvW8NQWuB0w+NrFcws7sEJYFuxP3DJe/lYsn7WqqAxPFqedfUSg7odml5pWYPn3yl/uLd9+dI+wJLcy7Yvi/4ptTCfHIqebmvJDueAe798zw0EfDIbEX85cGhbxUK8sHIOaTJFfPWwcRoNajeWKLD/5ppn/j8/TnyAoEL77J/11e875bvkT/WAZSWesvZ1+zPi3eI7umvlqAev70XD5ezE/198mfaYGucEtjxehCDUkZrmeordTo8935yYvtOQ9oXuHwR/p17xPdGd/KR3Bab1drpMM/3mR5J598RZzJ5WJ3rFWi1+KBU9Nk4Boj5hsyBTkfUW01+cu7f7qWxz/gkBHBpCf7kOL6/teyO9OTTbNoCmAETinD4TvlDkMLcGX1MHczk/GyWn/A92knE12fvGJ0O6u0mnjz/EV4aHZekJFDrCH/bIA4N5HAEzFnoFErb1TlJHfzAeWGW71USpE2AEMxFmzqIG3wnEoi66k9LVfWb8qgjKYBaJPxyHx/qz9AzxJStX2a0uxqD2y1MzgEMWAukHTbW6lEppJDsSLuE4BIHF69F4oDUQRDzXBxyRjMuRcof6aVDhcA+YynNNrsWLnHo1hiVsx66VQY7i3YV8aX/+r+oXPCfVo+N5ZUn3UFF9nNMq4/Ka1ZpZoRKbBvJ2ogguGjcd3LaPmUpzXYTBrn1+2kXiFYEmBHXFswvL5zr/Ulvn63rk7Snvd+9/pF1DAm6pj8ZkRDIqKS/X7qfCiFaDMp1Eqcjx+vDsXYXAJp1HTVWwuc6cXA0PxA3c4UU4s0HbgMLuc9z0R8UpYUNN6IApBBwzCDGhiChY6v845EzR0OTtrL5BMtVA01Cg6U+5Wz6GmzyDcGEG2YYDjcHSxWT5x1LpXnWF7bFlrFcNZiavQjNQkKmUdsp/zk4t0ck3aErImIzwjVzGACUjkgHx50XHlXOtgGGE+rqwpOCCaw9NL6495TzzNOkTMU5AbIEt0msnjFI6Mh55pgLeo4Kl7bBBBbyum16dV1DCFC+X8ra4gOI4h+JJP4yrFWrpl9jvBCAUoDvL3BgjnMY/kqkaUcwYe/Jysb/wbqIhIg6YBMWkSRfh7WPIrV3gJwHZgEpLbT+BFq/Ac/7Lef7/ilWGg5MmNqA/DqBqyJaA0kCNBrA4OAA0nQMRFsBaAhRh9YfY3xiHv/5gKA9gAlTby9s2gCfAkC3APvzRVHqAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTA2LTI4VDIxOjMxOjA0KzA4OjAwguphvwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMi0xMC0zMVQyMjoxMTozOCswODowMGpLe9MAAABDdEVYdHNvZnR3YXJlAC91c3IvbG9jYWwvaW1hZ2VtYWdpY2svc2hhcmUvZG9jL0ltYWdlTWFnaWNrLTcvL2luZGV4Lmh0bWy9tXkKAAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OkhlaWdodAA0OIdghy0AAAAWdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgANDh/z0egAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADEzNTE2OTI2OTgM2znSAAAAEXRFWHRUaHVtYjo6U2l6ZQAyMzg5QhQA8w8AAABidEVYdFRodW1iOjpVUkkAZmlsZTovLy9ob21lL3d3d3Jvb3QvbmV3c2l0ZS93d3cuZWFzeWljb24ubmV0L2Nkbi1pbWcuZWFzeWljb24uY24vc3JjLzEwODg1LzEwODg1MzIucG5nbh4mBwAAAABJRU5ErkJggg==';
        styleSheet.insertRule('.magnet16 { width: 16px; height: 16px; background-image: url("' + magnetIcon16 + '"); }', 0);
        styleSheet.insertRule('.magnet24 { width: 24px; height: 24px; background-image: url("' + magnetIcon24 + '"); }', 0);

        var copyIcon16 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADgSURBVDhPY8AFJq5cKdq/ZO2e/iXrdoHYUGHcIDQ0lNk1KrnVNSplVc2E2Y+bpy143TJr8QkQbpq64DVIDCQHxC0gtVBtCOASmeyVWdX0/+CJ0/8nLV3/f8KSdSgYJAaSA6kBqYVqQwDnqOSo9imz/4PAs1dv/996+AQFP3v9FiwHUgNSC9WGAMgG4ANEGcC88gsGXvbwN1iOPi4IP/YDAx95/QcsR5QBqx/9RsHIgD4GUOwFdM3IgCgD8AGcBiAnZXwYpMY1KtUTqg0BQBnEJSqlCZph8OFGrJmJPMDAAABHjep3UxrmRQAAAABJRU5ErkJggg==';
        styleSheet.insertRule('.copy16 { width: 16px; height: 16px; float: left; background-image: url("' + copyIcon16 + '"); }', 0);
    }

    var createMagnetLinkButton = function(size){
        var magnetImgButtonClasses;
        if(size == 16)
        {
            magnetImgButtonClasses = 'magnet-icon magnet16';
        }
        else if(size == 24)
        {
            magnetImgButtonClasses = 'magnet-icon magnet24';
        }

        var magnetImgButton = document.createElement('img');
        magnetImgButton.className = magnetImgButtonClasses;
        var magnetA = document.createElement('a');
        magnetA.appendChild(magnetImgButton);
        magnetA.title = 'download'
        magnetA.style.cursor = 'pointer';

        return magnetA;
    }

    var createSelectButton = function ()
    {
        var checkbox = document.createElement('input');
        checkbox.type = "checkbox";

        return checkbox;
    }

    var createCopyMagnetListButton = function()
    {
        var button = document.createElement("input");
        button.type = "button";
        button.value = "Copy Selected Magnet";
        button.style.float = 'left';
        return button;
    }

    var createCopyTrackerToClipboardButton = function(){
        var copyButton = document.createElement('img');
        copyButton.className = 'copy16';
        var copyA = document.createElement('a');
        copyA.appendChild(copyButton);
        copyA.style.cursor = 'pointer';
        copyA.title = 'copy tracker list'
        return copyA;
    }

    var createHiddenTextArea = function()
    {
        var textarea = document.createElement("textarea");
        textarea.id = 'hidden_text_area_for_clip';
        textarea.style.position = 'fixed';
        return textarea;
    }

    var main = function()
    {
        var copyMagnetListButton, selectButton, magnetA, hash_url, regexp, hash, name;

        var i;

        createButtonStyle();

        /* add text area for copying text to clipboard */
        var hiddenTextArea = createHiddenTextArea();
        document.querySelectorAll('body')[0].appendChild(hiddenTextArea);

        /********************************************************
         *
         *            for torrent search page
         *
         *******************************************************/

        var links = document.querySelectorAll('.results dl a');

        if(links[0])
        {
            var header = document.querySelectorAll('.results > h3')[0];
            copyMagnetListButton = createCopyMagnetListButton();
            copyMagnetListButton.hiddenTextArea = hiddenTextArea;
            copyMagnetListButton.selectButtonClass = 'tz_select_torrent';
            copyMagnetListButton.onclick = copyMagnetList;
            header.insertBefore(copyMagnetListButton, header.firstChild);

            for (i = 0; i < links.length; i++)
            {
                hash_url = links[i].href;
                regexp = /https?:\/\/[\w\.-]+\/([0-9a-fA-F]+)$/g;
                hash = regexp.exec(hash_url)[1];
                name = links[i].textContent;

                selectButton = createSelectButton();
                selectButton.classList.add('tz_select_torrent');
                links[i].parentNode.insertBefore(selectButton, links[i]);

                magnetA = createMagnetLinkButton(16);
                magnetA.href = generateMagnet(hash, name);
                magnetA.addEventListener('click', openMagnet);
                links[i].parentNode.insertBefore(magnetA, links[i]);

            }
        }


        /********************************************************
         *
         *            for torrent info page
         *
         *******************************************************/

        var torrent_title = document.querySelectorAll('div.downlinks > h2 > span')[0];
        if(!torrent_title)
        {
            torrent_title = document.querySelectorAll('div.downurls > h2 > span')[0];
        }
        var trackers_dt = document.querySelectorAll('div.trackers > dl > dt');

        var tracker_bottom_line = document.querySelectorAll('div.trackers > p')[0];

        var trackers;

        if(torrent_title)
        {
            trackers = [];
            for (i = 0; i < trackers_dt.length; i++)
            {
                trackers.push(trackers_dt[i].textContent);
            }

            /* Add Magnet Button */

            hash_url = window.location.href;
            regexp = /https?:\/\/[\w\.-]+\/([0-9a-fA-F]+)$/g;
            hash = regexp.exec(hash_url)[1];
            name = torrent_title.textContent;


            magnetA = createMagnetLinkButton(24);
            magnetA.href = generateMagnet(hash, name, trackers);
            magnetA.addEventListener('click', openMagnet);

            torrent_title.parentNode.insertBefore(magnetA, torrent_title);

            /* Add Copy Tracker Button */

            var copyA = createCopyTrackerToClipboardButton();
            copyA.trackers = trackers;
            copyA.hiddenTextArea = hiddenTextArea;
            copyA.addEventListener('click', copyTrackers);
            tracker_bottom_line.insertBefore(copyA,tracker_bottom_line.childNodes[0]);
        }
    }

    main();

})();