// ==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
// @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('/torrents.php?type=seeding&userid=' + userId) > -1 || document.location.href.indexOf('/torrents.php?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);
if (data.group.categoryName === 'Music') {
var media = data.torrent.media;
if (media === 'WEB') media = 'Web';
input(form, 'artist', data.group.musicInfo.artists[0].name);
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', data.torrent.description);
} else {
input(form, 'desc', strip(data.group.wikiBody) + "\n" + data.torrent.description);
}
input(form, 'release_desc', data.torrent.description);
input(form, 'submit', 'true');
input(form, 'image', data.group.wikiImage);
input(form, 'title', data.group.name);
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(data.group.musicInfo.artists[0].name) +'&action=advanced&torrentname='+ encodeURIComponent(data.group.name) +'&format='+ encodeURIComponent(data.torrent.format) +'&disablegrouping=1'
: 'https://baconbits.org/torrents.php?disablegrouping=1&searchstr=' + data.group.name;
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';
search.innerHTML = 'Found on bB:
';
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]");
var tmp = document.createElement("DIV");
tmp.innerHTML = html;
return tmp.textContent || tmp.innerText || "";
}