// ==UserScript== // @name What.CD to bB Crossposter // @description Fills the bB upload form with data from WCD // @namespace BlackNullerNS // @include http*://what.cd/torrents.php* // @include http*://what.cd/artist.php?id=* // @version 1.1.4 // @grant GM_xmlhttpRequest // @downloadURL none // ==/UserScript== var span, pos, lnk; var bb = document.createElement('a'); bb.textContent = '+bB'; bb.setAttribute('href', '#'); bb.setAttribute('title', 'Crosspost to bB'); var userId = document.getElementById('nav_userinfo').firstElementChild.getAttribute('href').split('?id=')[1]; if (document.location.href.indexOf('type=seeding&userid=' + userId) > -1 || document.location.href.indexOf('type=uploaded&userid=' + userId) > -1) { var t, torrents = document.getElementsByClassName('torrent_links_block'); for (var i = 0, l = torrents.length; i < l; i++) { t = torrents.item(i); pos = t.lastElementChild.nextSibling; t.insertBefore(document.createTextNode(" | "), pos); lnk = bb.cloneNode(true); lnk.onclick = crossPostToBb; t.insertBefore(lnk, pos); } return; } var seeded = document.getElementsByClassName('wcds_seeding'); if (seeded.length === 0) seeded = document.getElementsByClassName('wcds_snatched'); if (seeded.length === 0) seeded = document.getElementsByClassName('wcds_uploaded'); if (seeded.length > 0) { for (var i = 0, l = seeded.length; i < l; i++) { span = seeded.item(i).parentNode.firstElementChild; pos = span.lastElementChild.nextSibling; span.insertBefore(document.createTextNode(" | "), pos); lnk = bb.cloneNode(true); lnk.onclick = crossPostToBb; span.insertBefore(lnk, pos); } return; } seeded = document.getElementsByClassName('snatched_torrent'); if (seeded.length > 0) { for (var i = 0, l = seeded.length; i < l; i++) { span = seeded.item(i).firstElementChild.firstElementChild; pos = span.lastElementChild.nextSibling; span.insertBefore(document.createTextNode(" | "), pos); lnk = bb.cloneNode(true); lnk.onclick = crossPostToBb; span.insertBefore(lnk, pos); } return; } function loadTorrentInfo(a, callback) { var tr = a.closest('tr'); var id = ('id' in tr && tr.id) ? tr.id.replace('torrent', '') : a.parentNode.firstElementChild.getAttribute('href').split('&id=')[1].split('&')[0]; GM_xmlhttpRequest({ url: 'https://what.cd/ajax.php?action=torrent&id=' + id, method: 'GET', onload: function(response){ try { var data = JSON.parse(response.responseText); if (data.status !== 'success') { alert('Request failed!'); return; } } catch (e) { alert('Bad response from What.CD API'); return; } if (!('torrent' in data.response)) { alert('Unexpected response from What.CD API'); return; } callback(data.response); }, timeout: 7000, ontimeout: function(response){ alert('API request timed out!'); } }); return false; } function crossPostToBb(data) { if (!('torrent' in data)) { return loadTorrentInfo(this, crossPostToBb); } var form = document.createElement('form'); form.setAttribute('target', '_blank'); form.setAttribute('method', 'post'); form.setAttribute('action', 'https://baconbits.org/upload.php'); input(form, 'type', data.group.categoryName); var artist = ''; var groupName = data.group.name.replace(/&/g, '&'); if (data.group.categoryName === 'Music') { var media = data.torrent.media; if (media === 'WEB') media = 'Web'; if (data.group.musicInfo.artists.length > 2) { artist = 'Various Artists'; } else if (data.group.musicInfo.artists.length === 2) { artist = data.group.musicInfo.artists[0].name + ' & ' + data.group.musicInfo.artists[1].name; } else { artist = data.group.musicInfo.artists[0].name; } artist = artist.replace(/&/g, '&'); input(form, 'artist', artist); input(form, 'media', media); input(form, 'format', data.torrent.format); input(form, 'bitrate', data.torrent.encoding); if (data.torrent.remasterTitle) { input(form, 'remaster', 1); input(form, 'remaster_year', data.torrent.remasterYear); input(form, 'remaster_title', data.torrent.remasterTitle); } } if (data.group.categoryName === 'Music' || data.group.categoryName === 'Audiobooks') { input(form, 'album_desc', strip(data.group.wikiBody)); input(form, 'release_desc', strip(data.torrent.description)); } else { input(form, 'desc', strip(data.group.wikiBody) + "\n" + strip(data.torrent.description)); } input(form, 'submit', 'true'); input(form, 'image', data.group.wikiImage); input(form, 'title', groupName); input(form, 'year', data.group.year); input(form, 'tags', data.group.tags.join(', ')); if (data.torrent.scene) { input(form, 'scene', 1); } var div = document.createElement("div"); div.setAttribute("id","bbConfirm"); div.setAttribute("style", "position:fixed;width:260px;top:50%;left:50%;margin-top:-5%;margin-left:-130px;padding:30px;display:inline-block;border:1px solid #666;border-radius:6px;-moz-box-shadow: 0px 0px 7px #2e2e2e;-webkit-box-shadow: 0px 0px 7px #2e2e2e;box-shadow: 0px 0px 7px #2e2e2e;background:#fff;text-align:center;z-index:200;transition:all 0.5s;transition-delay:0s;"); var search = document.createElement("div"); search.style.marginBottom = '18px'; search.textContent = 'Searching bB...'; var btn = document.createElement("button"); btn.type = "submit"; btn.appendChild(document.createTextNode("Repost to bB?")); div.appendChild(search); div.appendChild(btn); var a = document.createElement("a"); a.style.cursor = "pointer"; a.appendChild(document.createTextNode("Cancel")); div.appendChild(document.createElement("br")); div.appendChild(document.createElement("br")); div.appendChild(a); form.appendChild(div); document.body.appendChild(form); form.onsubmit = function(){ setTimeout(function(){ form.parentNode.removeChild(form); }, 1000); }; a.onclick = function(){ form.parentNode.removeChild(form); }; url = data.group.categoryName === 'Music' ? 'https://baconbits.org/torrents.php?artistname='+ encodeURIComponent(artist) +'&action=advanced&torrentname='+ encodeURIComponent(groupName) +'&format='+ encodeURIComponent(data.torrent.format) +'&disablegrouping=1' : 'https://baconbits.org/torrents.php?disablegrouping=1&searchstr=' + encodeURIComponent(groupName); GM_xmlhttpRequest({ url: url, method: 'GET', onload: function(response){ if (response.responseText.indexOf('action=download') === -1) { search.innerHTML = 'No duplicates found on bB, go ahead!'; return; } div.style.width = '600px'; div.style.marginLeft = '-300px'; var searchLink = document.createElement('a'); searchLink.setAttribute('href', url); searchLink.setAttribute('target', '_blank'); searchLink.style.fontWeight = 'bold'; searchLink.textContent = 'Found on bB:'; search.textContent = ''; search.appendChild(searchLink); search.appendChild(document.createElement('br')); var dom = document.createElement("div"); dom.insertAdjacentHTML("afterbegin", response.responseText.replace(/(.+?)<\/a>/g, "[url=$1]$2[/url]"); html = html.replace(//g, "[img]$1[/img]"); html = html.replace(/(.+?)<\/span>/g, "[size=$1]$2[/size]"); html = html.replace(/(.+?)<\/span>/g, "[color=$1]$2[/color]"); html = html.replace(/(.+?)<\/ol>/g, "[list=1]\n$1[/list]"); html = html.replace(/(.+?)<\/ul>/g, "[list]\n$1[/list]"); html = html.replace(/(.+?)<\/li>/g, "[#]$1\n"); html = html.replace(/(.+?)<\/b>/g, "[b]$1[/b]"); html = html.replace(/(.+?)<\/strong>/g, "[b]$1[/b]"); html = html.replace(/(.+?)<\/i>/g, "[i]$1[/i]"); html = html.replace(/(.+?)<\/em>/g, "[i]$1[/i]"); html = html.replace(/(.+?)<\/s>/g, "[s]$1[/s]"); html = html.replace(/(.+?)<\/u>/g, "[u]$1[/u]"); html = html.replace(/\[hide/g, "[spoiler"); html = html.replace(/\[\/hide\]/g, "[/spoiler]"); var tmp = document.createElement("DIV"); tmp.innerHTML = html; return tmp.textContent || tmp.innerText || ""; }