Link Scanner

Easy copy for Links

// ==UserScript==
// @name         Link Scanner
// @namespace    SWScripts
// @version      1.2
// @description  Easy copy for Links
// @license      MIT
// @match        https://privatebin.rinuploads.org/*
// @grant        GM_addStyle
// ==/UserScript==

(function () {
  'use strict';

  function copyToClipboard(text) {
    const textarea = document.createElement('textarea');
    textarea.value = text;
    document.body.appendChild(textarea);
    textarea.select();
    document.execCommand('copy');
    document.body.removeChild(textarea);
  }

  function copyLinksByHostname(baseID) {
    const preElement = document.getElementById('prettyprint');
    if (preElement) {
      const links = preElement.querySelectorAll('a');
      const linksByHostname = new Map();

      links.forEach(link => {
        const hostname = new URL(link.href).hostname;
        if (!linksByHostname.has(hostname)) {
          linksByHostname.set(hostname, []);
        }
        linksByHostname.get(hostname).push(link.href);
      });

      linksByHostname.forEach((links, hostname) => {
        const linksText = links.join('\n');

        const copyButton = document.createElement('button');
        copyButton.textContent = `Copy ${hostname} (${links.length})`;
        copyButton.id = `${baseID}${hostname.replace(/\./g, '')}`;
        copyButton.className = 'btn btn-warning navbar-btn';
        copyButton.addEventListener('click', () => copyToClipboard(linksText));

        const linksFinderButton = document.getElementById('LinksFinder');
        if (linksFinderButton) {
          linksFinderButton.insertAdjacentElement('afterend', copyButton);
        }
      });
    }
  }

  function executeLinkScan() {
    const previousButtons = document.querySelectorAll('[id^="base"]');
    previousButtons.forEach(button => button.parentNode.removeChild(button));
    copyLinksByHostname('base');
  }

  const scanButton = document.createElement('button');
  scanButton.textContent = 'Scan Links';
  scanButton.id = 'LinksFinder';
  scanButton.className = 'btn btn-warning navbar-btn';
  scanButton.addEventListener('click', executeLinkScan);

  const buttonContainer = document.createElement('div');
  buttonContainer.id = 'linkScanner_buttons';

  const qrcodelinkButton = document.getElementById('qrcodelink');
  if (qrcodelinkButton) {
    qrcodelinkButton.insertAdjacentElement('afterend', scanButton);
    qrcodelinkButton.insertAdjacentElement('afterend', buttonContainer);
  }

  GM_addStyle(`
    .navbar-btn {
        margin-top: 10px;
        margin-bottom: 10px;
    }

    .btn-warning {
        color: #fff;
        background-color: #ff8c00;
        border-color: #ff8c00;
        transition: background-color 0.3s, transform 0.3s;
    }

    .btn-warning:hover {
        background-color: #ffa500;
        transform: scale(1.05);
    }

    .btn-warning:active {
        background-color: #ff8c00;
        transform: scale(1.00);
    }

    .btn {
        display: inline-block;
        margin-bottom: 0;
        font-weight: bold;
        text-align: center;
        vertical-align: middle;
        touch-action: manipulation;
        cursor: pointer;
        background-image: none;
        border: 1px solid transparent;
        white-space: nowrap;
        padding: 6px 12px;
        font-size: 14px;
        line-height: 1.42857143;
        border-radius: 4px;
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
        transition: background-color 0.3s, transform 0.3s;
    }

    #linkScanner_buttons {
        margin-top: 20px;
        display: flex;
        flex-direction: column;
    }

    .btn-secondary {
        color: #fff;
        background-color: #ff8c00;
        border-color: #ff8c00;
    }

    .btn-secondary:hover {
        background-color: #ffa500;
        transform: scale(1.05);
    }

    .btn-secondary:active {
        background-color: #ff8c00;
        transform: scale(1.00);
    }
  `);

  executeLinkScan();
})();