// ==UserScript==
// @name Bunkr Filter
// @version 1.1
// @description Filter bunker images and videos by size and type
// @match https://bunkr.is/a/*
// @match https://bunkr.ru/a/*
// @match https://bunkr.su/a/*
// @icon https://bunkr.su/images/logo.svg
// @grant none
// @namespace https://greasyfork.org/users/1030442
// ==/UserScript==
let filtering = 'None';
let sizeFilter = 0;
const imageFormats = ['.gif', '.GIF', '.Gif','.jpeg', '.Jpeg', '.JPEG', '.jpg', '.JPG', '.Jpg', '.png', '.PNG', '.Png','.webp', '.WEBP', '.Webp'];
const videoFormats = ['.avi', '.AVI', '.Avi','.flv', '.FLV', '.Flv','.mkv', '.MKV', '.Mkv', '.mov', '.Mov', '.MOV','.mp4', '.MP4', '.Mp4','.webm', '.Webm', '.WEBM','.WMV', '.wmv', '.Wmv'];
const imageBoxes = document.querySelectorAll('.grid-images_box a[href$="' + imageFormats.join('"], .grid-images_box a[href$="') + '"]');
const videoBoxes = document.querySelectorAll('.grid-images_box a[href$="' + videoFormats.join('"], .grid-images_box a[href$="') + '"]');
const otherBoxes = document.querySelectorAll('.grid-images_box a:not(' + Array.from(imageBoxes).map(box => `:is(${box.tagName.toLowerCase()}[href="${box.getAttribute('href')}"])`).concat(Array.from(videoBoxes).map(box => `:is(${box.tagName.toLowerCase()}[href="${box.getAttribute('href')}"])`)).join(', ') + ')');
const filterOptions = ['Show All', 'Filter Images', 'Filter Videos', 'Filter Other'];
const filterDropdown = document.createElement('select');
filterDropdown.style.cssText = 'padding:5px;color:black;max-height:30px; max-width: 150px; border-radius:2px';
filterOptions.forEach((text, index) => {
const option = document.createElement('option');
option.textContent = text;
option.value = index;
filterDropdown.appendChild(option);
});
filterDropdown.addEventListener('change', () => {
const selectedIndex = parseInt(filterDropdown.value);
switch (selectedIndex) {
case 1:
filtering = 'Images';
break;
case 2:
filtering = 'Videos';
break;
case 3:
filtering = 'Other';
break;
default:
filtering = 'None';
}
filterBoxes();
});
const minSizeInput = document.createElement('input');
minSizeInput.type = 'number';
minSizeInput.min = '0';
minSizeInput.placeholder = 'size in MB';
minSizeInput.style.cssText = 'padding:5px;color:black; max-height:30px; max-width: 150px; border-radius:2px';
minSizeInput.addEventListener('change', () => {
sizeFilter = minSizeInput.value;
filterBoxes();
});
function filterBoxes() {
if (filtering === 'Videos') {
videoBoxes.forEach(box => toggleView(box.parentElement.parentElement));
imageBoxes.forEach(box => box.parentElement.parentElement.style.display = 'none');
otherBoxes.forEach(box => box.parentElement.parentElement.style.display = 'none');
} else if (filtering === 'Images') {
imageBoxes.forEach(box => toggleView(box.parentElement.parentElement));
videoBoxes.forEach(box => box.parentElement.parentElement.style.display = 'none');
otherBoxes.forEach(box => box.parentElement.parentElement.style.display = 'none');
} else if (filtering === 'Other') {
otherBoxes.forEach(box => toggleView(box.parentElement.parentElement));
imageBoxes.forEach(box => box.parentElement.parentElement.style.display = 'none');
videoBoxes.forEach(box => box.parentElement.parentElement.style.display = 'none');
} else {
imageBoxes.forEach(box => toggleView(box.parentElement.parentElement));
videoBoxes.forEach(box => toggleView(box.parentElement.parentElement));
otherBoxes.forEach(box => toggleView(box.parentElement.parentElement));
}
}
function toggleView(box) {
const [sizeValue, sizeUnit] = box.children[1].children[1].textContent.trim().split(' ');
const sizeInMB = convertToMB(parseFloat(sizeValue), sizeUnit);
const show = sizeInMB >= sizeFilter;
box.style.display = show ? 'block' : 'none';
}
function convertToMB(sizeValue, sizeUnit) {
const multiplier = sizeUnit.toLowerCase() === 'gib' || sizeUnit.toLowerCase() === 'gb'
? 1024
: sizeUnit.toLowerCase() === 'mib' || sizeUnit.toLowerCase() === 'mb'
? 1
: sizeUnit.toLowerCase() === 'kib' || sizeUnit.toLowerCase() === 'kb'
? 1 / 1024
: 1;
return sizeValue * multiplier;
}
const sizeContainer = document.createElement('div');
const sizeContainerTitle = document.createElement('p')
sizeContainerTitle.innerText = 'Filter by Size'
sizeContainer.appendChild(sizeContainerTitle)
sizeContainer.appendChild(minSizeInput);
const typeContainer = document.createElement('div')
const typeContainerTitle = document.createElement('p')
typeContainerTitle.innerText = 'Filter by Type'
typeContainer.appendChild(typeContainerTitle)
typeContainer.appendChild(filterDropdown)
sizeContainer.style.cssText = 'display: flex; flex-direction:column; align-items:center;border:2px solid white; padding:10px; border-radius:4px'
typeContainer.style.cssText = 'display: flex; flex-direction:column; align-items:center;border:2px solid white; padding:10px; border-radius:4px'
const filtersBox = document.createElement('div');
filtersBox.style.cssText = 'display:flex;flex-direction:row;align-items:center;justify-content:center;gap:20px;padding:10px;';
filtersBox.appendChild(typeContainer);
filtersBox.appendChild(sizeContainer);
document.querySelector('.friends').appendChild(filtersBox);