🏠 Home 

BCPop

Filter bandcamp user collections by popularity


Install this script?
// ==UserScript==
// @name        BCPop
// @author      theinternetftw
// @namespace   theinternetftw.com
// @description Filter bandcamp user collections by popularity
// @license     GPL version 2 or any later version; http://www.gnu.org/licenses/gpl-2.0.txt
// @include     https://bandcamp.com/*
// @version     1.0
// @grant       none
// ==/UserScript==
var defaultThreshold = 0;
var rangeLimit = 1000;
var visUpdateInterval = 100; // ms
var ajaxUpdateInterval = 2500; // ms, for bc's lazy loading
var isPopular = function($item) {
if (threshold === 0)
return true;
if (!$item.has('.collected-by-header').length)
return false;
var collectors = $item.find('.collected-by-header').find('a').text().trim().split(' ')[0];
return parseInt(collectors) >= threshold;
};
var updateVis = function() {
$('.collection-item-container').has('.collection-item-fav-track').each(function() {
var $item = $(this);
isPopular($item) ? $item.show() : $item.hide();
});
};
var updateControls = function() {
$('#bcpop-threshold').text('BCPop: ' + threshold);
};
var threshold = defaultThreshold;
var everTouchedControls = false;
var shouldUpdateVis = false;
if ($('.fan-banner').length) {
var input = document.createElement('input');
input.type = 'range';
input.max = rangeLimit;
input.value = threshold;
input.addEventListener('input', function(e) {
everTouchedControls = true;
shouldUpdateVis = true;
threshold = e.target.value;
updateControls();
});
var span = document.createElement('span');
span.id = 'bcpop-threshold';
span.style.fontSize = '8pt';
var div = document.createElement('div');
div.style.position = 'fixed';
div.style.backgroundColor = 'white';
div.style.bottom = 0;
div.appendChild(input);
div.appendChild(span);
document.body.appendChild(div);
// don't spam DOM updates
setInterval(function() {
if (shouldUpdateVis) {
shouldUpdateVis = false;
updateVis();
}
}, visUpdateInterval);
// encorage bc to load more songs if you've touched the controls on this page
setInterval(function() {
everTouchedControls && $(window).scroll();
}, ajaxUpdateInterval);
var observer = new MutationObserver(function(mutation) {
shouldUpdateVis = true;
});
observer.observe(document.body, {childList:true, subtree:true});
updateControls();
updateVis();
}