NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @author Reiis (originally Sycam Inc (origionally Alvaro))
// @name TTS Steam Workshop Downloader
// @description Adds an extra button to download and convert TTS workshop items
// @include *steamcommunity.com/sharedfiles/filedetails/?id=*
// @include *steamcommunity.com/workshop/filedetails/?id=*
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
// @require https://raw.githubusercontent.com/mongodb/js-bson/master/browser_build/bson.js
// @grant GM_xmlhttpRequest
// @version 2.1
// @license MIT
// @namespace https://openuserjs.org/users/Reiis
// ==/UserScript==
var patt = new RegExp("[0-9]{2,15}");
var id = patt.exec(document.URL);
var baseURL = "http://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v0001/";
var baseURLCtn = "http://api.steampowered.com/ISteamRemoteStorage/GetCollectionDetails/v0001/";
if (document.URL.indexOf("steamcommunity.com") != -1) {
if (document.URL.indexOf("workshop") == -1) {
addWorkshopBtn(id);
}
}
function fix_data(data) {
for (var k in data) {
var v = data[k];
if (v == null || v == undefined) {
delete data[k];
} else if (typeof v === 'object') {
fix_data(v);
}
}
return data;
}
// http://stackoverflow.com/a/18197341
function download(filename, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
function downloadBson(url, id) {
GM_xmlhttpRequest({
method: "POST",
url: url,
data: "itemcount=1&publishedfileids[0]=" + id + "&format=json",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function (response) {
//console.log(response.responseText);
//debugger;
data = jQuery.parseJSON(response.responseText);
console.log(data);
var filedetails = data.response.publishedfiledetails[0];
var fileurl = filedetails.file_url;
GM_xmlhttpRequest({
method: "GET",
url: fileurl,
onload: function (response) {
var resp = response.response;
var bb = new ArrayBuffer(resp.length);
for (var i = 0; i < resp.length; i++) {
bb[i] = resp.charCodeAt(i) & 0xff;
}
var BSON = require('bson').BSON;
var db = BSON.deserialize(bb);
var stringdata = JSON.stringify(fix_data(db), null, 2);
console.log(stringdata);
var filename = filedetails.title + ' (' + publishedfileid + ').json';
download(filename, stringdata);
},
onerror: function (reponse) {
//alert('error');
console.log(reponse);
},
overrideMimeType: 'text/plain; charset=x-user-defined'
});
},
onerror: function (reponse) {
//alert('error');
console.log(reponse);
}
});
}
function addWorkshopBtn(id) {
var element = document.getElementById("AddToCollectionBtn");
var button = document.createElement('span');
button.setAttribute('class', 'general_btn share tooltip');
//button.setAttribute('href', baseURLCtn + id);
button.innerHTML = '<span id="SubscribeItemOptionAdd3"><span>Get TTS json</span></span>';
// Append the element after the real subscribe button
if (element.nextSibling) {
element.parentNode.insertBefore(button, element.nextSibling);
} else {
element.parentNode.appendChild(button);
}
//downloadBson(baseURL, id);
$("#SubscribeItemOptionAdd3").click(function (e) {
e.preventDefault(); //stop the browser from following
downloadBson(baseURL, id);
});
// Change the stupid text to the left of it
document.querySelectorAll(".game_area_purchase_game")[0].getElementsByTagName('h1')[0].setAttribute('style', 'width: 300px;');
}