Skip to content

Instantly share code, notes, and snippets.

@ip2k
Last active January 2, 2016 07:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ip2k/3d81507c810314991bdf to your computer and use it in GitHub Desktop.
Save ip2k/3d81507c810314991bdf to your computer and use it in GitHub Desktop.
Add Transmission button to Kickass.to (requires a modified CORSProxy running on 127.0.0.1:1337)
// ==UserScript==
// @name Kickass Add Button
// @namespace http://your.homepage/
// @version 0.1
// @description enter something useful
// @author You
// @match https://kickass.tld/*
// @grant none
// ==/UserScript==
// remember to start corsproxy locally, and remember to modify lib/add-cors-headers.js for CORSProxy to accept 'X-Transmission-Session-Id'
window.session_id = '';
$('.imagnet, .magnetlinkButton').each(function(idx, element) {
var ele = $(element);
var magnet_link = ele.attr('href');
// ele.before('<input id="add" type="button" class="translink" value="add" onclick="add_to_transmission(\'' + magnet_link + '\');" />');
ele.before('<img style="margin-bottom: -10px !important" onclick="add_to_transmission(\'' + magnet_link + '\');" src="data:image/png;base64,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" />');
} );
// $('.translink').css('background', 'url()');
window.add_to_transmission = function(magnet_link) {
var url = 'http://127.0.0.1:1337/127.0.0.1:9091/transmission/rpc';
payload = {
"method": "torrent-add",
"arguments": {
"paused": false,
"download-dir": "/torrent",
"filename": magnet_link
}
};
$.ajax({
type: "POST",
headers: {'X-Transmission-Session-Id': window.session_id },
url: url,
data: JSON.stringify(payload),
success: function(xhr, textStatus, errorThrown) {
console.log(textStatus, xhr.arguments);
},
dataType: 'json',
tryCount: 0,
retryLimit: 3,
statusCode: {
// 409 is Transmission's special way of saying 498 or 499 (token issue)
409: function(xhr, textStatus, errorThrown ) {
this.tryCount++;
if (this.tryCount <= this.retryLimit) {
// update session headers and retry
var begin = xhr.responseText.indexOf('X-Transmission-Session-Id:');
var end = xhr.responseText.indexOf('</code>');
// update the headers. We should have been able to use the server response's headers, but corsproxy seems to strip those :<
// this is some hax as it relies on scraping the error page (lol)
this.headers['X-Transmission-Session-Id'] = xhr.responseText.slice(begin, end).split('X-Transmission-Session-Id: ')[1];
window.session_id = this.headers['X-Transmission-Session-Id']; // so it doesn't need to retry next time too
$.ajax(this);
return;
}
return;
}
}
});
};
@ip2k
Copy link
Author

ip2k commented May 10, 2015

Note also that you'll need to change var url = 'http://127.0.0.1:1337/127.0.0.1:9091/transmission/rpc'; to reflect where Transmission is running in your environment.

See http://i.imgur.com/NgucIQf.png & http://i.imgur.com/JRUHYV9.png for screenshots of this in action.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment