NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Radiopaedia Stack Downloader
// @namespace rsd
// @license MIT
// @description Adds a button on studies to download all slides from a stack
// @author CryptalEquine
// @include *radiopaedia.org/cases/*
// @version 1.0.4
// @run-at document-start
// @noframes true
// @grant GM_download
// @downloadURL https://openuserjs.org/install/CryptalEquine/Radiopaedia_Stack_Downloader.user.js
// @updateURL https://openuserjs.org/meta/CryptalEquine/Radiopaedia_Stack_Downloader.meta.js
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js
// @require https://gist.githubusercontent.com/BrockA/2625891/raw/9c97aa67ff9c5d56be34a55ad6c18a314e5eb548/waitForKeyElements.js
// ==/UserScript==
var iconURL = 'https://i.imgur.com/XgaqfQ8.png';
var currentDownloads = 0;
waitForKeyElements('div.download[data-name="download"]', function(d) {
(async function() {
try {
var e = $(d).parents('div.case-study[data-study-id]');
var studyAPI = e.attr('data-study-stacks-url');
var studyData = await $.ajax({url: 'https://radiopaedia.org' + studyAPI});
var id = "dlstack_" + getModalityData(e, studyData).type;
$(d).parent().append(`<style>.icon.dlstack { background: transparent url(` + iconURL + `) top left no-repeat; }</style>
<div class="js-tooltip icon dlstack" data-placement="top" data-theme="grey" data-size="small"
data-original-title="Download Stack" id="` + id + `" style="padding-left: 5px;"></div>`);
(function(_e, _studyData) {
$('#' + id).click(async function() {
var queue = [];
var modality = getModalityData(_e, _studyData);
modality.data.forEach(function(value, index) {
queue.push({index: value.position, image: value.fullscreen_filename});
});
while (queue.length > 0) {
if (currentDownloads > 5) {
await sleep(1800);
continue;
}
var item = queue.shift();
(function(_item) {
GM_download({
url: _item.image + '?',
name: [modality.type, modality.name.trim(), _item.index].join('_'),
saveAs: false,
onerror: function(error) {
queue.unshift(_item);
currentDownloads--;
},
onload: function() {
currentDownloads--;
}
});
currentDownloads++;
})(item);
}
});
})(e, studyData);
}
catch(error) {
console.log(error);
}
})();
}, false);
function getModalityData(e, studyData) {
var currentModality = e.find('li.jcarousel-item.current');
var multiModalities = currentModality.length > 0;
var modalityName = !multiModalities ? e.find('div.title').html() : currentModality.find('span').eq(0).html();
var modalityIndex = !multiModalities ? 0 : e.find('li.jcarousel-item').index(currentModality);
return {
name: modalityName,
index: modalityIndex,
type: studyData[modalityIndex].modality,
data: studyData[modalityIndex].images
};
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}