// ==UserScript==
// @name Download All Images from Pixabay
// @namespace http://tampermonkey.net/
// @version 1.3
// @description Download all images from Pixabay
// @author @themrsami
// @match *://*.pixabay.com/*
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// Function to download images
function downloadImages() {
let images = document.images;
let imageNames = [];
for (let i = 0; i < images.length; i++) {
let src = images[i].src;
let url = new URL(src);
let pathname = url.pathname.substring(1);
let parts = pathname.split('/');
let filename = parts[parts.length - 1];
let [name, extension] = filename.split('.');
if (extension === 'png' || extension === 'jpg' || extension === 'jpeg') {
name = name.split('_')[0];
filename = `${name}.${extension}`;
imageNames.push(filename);
}
}
imageNames = [...new Set(imageNames)];
let baseUrl = 'https://pixabay.com/images/download/';
for (let imageName of imageNames) {
let downloadUrl = baseUrl + imageName;
fetch(downloadUrl)
.then(response => {
let contentLength = response.headers.get('Content-Length');
if (contentLength !== null) {
let sizeInBytes = Number(contentLength);
let sizeInKB = sizeInBytes / 1024;
if (sizeInKB > 100) {
return response.blob();
} else {
throw new Error('Image is less than 100 KB');
}
} else {
throw new Error('Could not determine image size');
}
})
.then(blob => {
let url = window.URL.createObjectURL(blob);
let a = document.createElement('a');
a.href = url;
a.download = imageName;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
})
.catch(error => console.error('Error:', error));
}
alert('Images are being downloaded!');
}
// Create a card
let card = document.createElement('div');
card.style.position = 'fixed';
card.style.top = '10px';
card.style.left = '10px';
card.style.zIndex = '9999';
card.style.padding = '20px';
card.style.borderRadius = '5px';
card.style.backgroundColor = '#333';
card.style.boxShadow = '0 2px 5px rgba(0, 0, 0, 0.3)';
card.style.color = '#fff';
card.style.width = '500px';
card.style.transition = '0.3s';
// Create tabs
let tabs = document.createElement('div');
tabs.style.display = 'flex';
tabs.style.justifyContent = 'space-between';
tabs.style.marginBottom = '20px';
// Create tab labels
let tabLabels = ['Home', 'Instructions', 'Author Info'];
// Create tabs
let tabElements = tabLabels.map(label => {
let tab = document.createElement('div');
tab.innerHTML = label;
tab.style.cursor = 'pointer';
tab.style.padding = '10px';
tab.style.backgroundColor = '#555';
tab.style.borderRadius = '5px';
tab.style.transition = '0.3s';
tab.onmouseover = function() {
this.style.backgroundColor = '#777';
};
tab.onmouseout = function() {
this.style.backgroundColor = (tab === activeTab) ? '#777' : '#555';
};
tab.addEventListener('click', () => setActiveTab(tab));
return tab;
});
// Set active tab
let activeTab = tabElements[0];
activeTab.style.backgroundColor = '#777';
// Add tabs to the tabs container
tabElements.forEach(tab => tabs.appendChild(tab));
// Create content container
let content = document.createElement('div');
// Create download button
let button = document.createElement('button');
button.innerHTML = 'Download All Images';
button.style.padding = '10px 20px';
button.style.fontSize = '16px';
button.style.borderRadius = '5px';
button.style.border = 'none';
button.style.backgroundColor = '#4CAF50';
button.style.color = 'white';
button.style.cursor = 'pointer';
// Add click event listener to the button
button.addEventListener('click', downloadImages);
// Create instructions text
let instructions = document.createElement('p');
instructions.innerHTML = `
<h3>Enable Parallel Downloading in Chrome Flags</h3>
<ul>
<br>
<li>Open Chrome and navigate to <br><code>chrome://flags/#enable-parallel-downloading</code></li><br>
<li>Select <strong>Enabled</strong> from the dropdown next to "Enable parallel downloading"</li><br>
<li>Click on the <strong>Relaunch</strong> button at the bottom to apply the changes</li><br>
</ul>
`;
// Create author info text
let authorInfo = document.createElement('p');
authorInfo.innerHTML = `
<h3 style="text-align: center;">Author Information</h3>
<div style="display: flex; gap: 10px; justify-content: center;">
<a href="https://www.youtube.com/@themistersami" target="_blank" rel="noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="40" width="40" version="1.1" id="Layer_1" viewBox="0 0 461.001 461.001" xml:space="preserve">
<g>
<path style="fill:#F61C0D;" d="M365.257,67.393H95.744C42.866,67.393,0,110.259,0,163.137v134.728 c0,52.878,42.866,95.744,95.744,95.744h269.513c52.878,0,95.744-42.866,95.744-95.744V163.137 C461.001,110.259,418.135,67.393,365.257,67.393z M300.506,237.056l-126.06,60.123c-3.359,1.602-7.239-0.847-7.239-4.568V168.607 c0-3.774,3.982-6.22,7.348-4.514l126.06,63.881C304.363,229.873,304.298,235.248,300.506,237.056z"/>
</g>
</svg>
</a>
<a href="https://www.github.com/themrsami" target="_blank" rel="noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" width="40px" height="40px" viewBox="0 -3.5 256 256" preserveAspectRatio="xMinYMin meet">
<g fill="#161614">
<path d="M127.505 0C57.095 0 0 57.085 0 127.505c0 56.336 36.534 104.13 87.196 120.99 6.372 1.18 8.712-2.766 8.712-6.134 0-3.04-.119-13.085-.173-23.739-35.473 7.713-42.958-15.044-42.958-15.044-5.8-14.738-14.157-18.656-14.157-18.656-11.568-7.914.872-7.752.872-7.752 12.804.9 19.546 13.14 19.546 13.14 11.372 19.493 29.828 13.857 37.104 10.6 1.144-8.242 4.449-13.866 8.095-17.05-28.32-3.225-58.092-14.158-58.092-63.014 0-13.92 4.981-25.295 13.138-34.224-1.324-3.212-5.688-16.18 1.235-33.743 0 0 10.707-3.427 35.073 13.07 10.17-2.826 21.078-4.242 31.914-4.29 10.836.048 21.752 1.464 31.942 4.29 24.337-16.497 35.029-13.07 35.029-13.07 6.94 17.563 2.574 30.531 1.25 33.743 8.175 8.929 13.122 20.303 13.122 34.224 0 48.972-29.828 59.756-58.22 62.912 4.573 3.957 8.648 11.717 8.648 23.612 0 17.06-.148 30.791-.148 34.991 0 3.393 2.295 7.369 8.759 6.117 50.634-16.879 87.122-64.656 87.122-120.973C255.009 57.085 197.922 0 127.505 0"/>
<path d="M47.755 181.634c-.28.633-1.278.823-2.185.389-.925-.416-1.445-1.28-1.145-1.916.275-.652 1.273-.834 2.196-.396.927.415 1.455 1.287 1.134 1.923M54.027 187.23c-.608.564-1.797.302-2.604-.589-.834-.889-.99-2.077-.373-2.65.627-.563 1.78-.3 2.616.59.834.899.996 2.08.36 2.65M58.33 194.39c-.782.543-2.06.034-2.849-1.1-.781-1.133-.781-2.493.017-3.038.792-.545 2.05-.055 2.85 1.07.78 1.153.78 2.513-.019 3.069M65.606 202.683c-.699.77-2.187.564-3.277-.488-1.114-1.028-1.425-2.487-.724-3.258.707-.772 2.204-.555 3.302.488 1.107 1.026 1.445 2.496.7 3.258M75.01 205.483c-.307.998-1.741 1.452-3.185 1.028-1.442-.437-2.386-1.607-2.095-2.616.3-1.005 1.74-1.478 3.195-1.024 1.44.435 2.386 1.596 2.086 2.612M85.714 206.67c.036 1.052-1.189 1.924-2.705 1.943-1.525.033-2.758-.818-2.774-1.852 0-1.062 1.197-1.926 2.721-1.951 1.516-.03 2.758.815 2.758 1.86M96.228 206.267c.182 1.026-.872 2.08-2.377 2.36-1.48.27-2.85-.363-3.039-1.38-.184-1.052.89-2.105 2.367-2.378 1.508-.262 2.857.355 3.049 1.398"/>
</g>
</svg>
</a>
<a href="https://www.instagram.com/themrsami" target="_blank" rel="noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="40" width="40" version="1.1" id="Layer_1" viewBox="0 0 551.034 551.034" xml:space="preserve">
<g id="XMLID_13_">
<linearGradient id="XMLID_2_" gradientUnits="userSpaceOnUse" x1="275.517" y1="4.5714" x2="275.517" y2="549.7202" gradientTransform="matrix(1 0 0 -1 0 554)">
<stop offset="0" style="stop-color:#E09B3D"/>
<stop offset="0.3" style="stop-color:#C74C4D"/>
<stop offset="0.6" style="stop-color:#C21975"/>
<stop offset="1" style="stop-color:#7024C4"/>
</linearGradient>
<path id="XMLID_17_" style="fill:url(#XMLID_2_);" d="M386.878,0H164.156C73.64,0,0,73.64,0,164.156v222.722 c0,90.516,73.64,164.156,164.156,164.156h222.722c90.516,0,164.156-73.64,164.156-164.156V164.156 C551.033,73.64,477.393,0,386.878,0z M495.6,386.878c0,60.045-48.677,108.722-108.722,108.722H164.156 c-60.045,0-108.722-48.677-108.722-108.722V164.156c0-60.046,48.677-108.722,108.722-108.722h222.722 c60.045,0,108.722,48.676,108.722,108.722L495.6,386.878L495.6,386.878z"/>
<linearGradient id="XMLID_3_" gradientUnits="userSpaceOnUse" x1="275.517" y1="4.5714" x2="275.517" y2="549.7202" gradientTransform="matrix(1 0 0 -1 0 554)">
<stop offset="0" style="stop-color:#E09B3D"/>
<stop offset="0.3" style="stop-color:#C74C4D"/>
<stop offset="0.6" style="stop-color:#C21975"/>
<stop offset="1" style="stop-color:#7024C4"/>
</linearGradient>
<path id="XMLID_81_" style="fill:url(#XMLID_3_);" d="M275.517,133C196.933,133,133,196.933,133,275.516 s63.933,142.517,142.517,142.517S418.034,354.1,418.034,275.516S354.101,133,275.517,133z M275.517,362.6 c-48.095,0-87.083-38.988-87.083-87.083s38.989-87.083,87.083-87.083c48.095,0,87.083,38.988,87.083,87.083 C362.6,323.611,323.611,362.6,275.517,362.6z"/>
<linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="418.306" y1="4.5714" x2="418.306" y2="549.7202" gradientTransform="matrix(1 0 0 -1 0 554)">
<stop offset="0" style="stop-color:#E09B3D"/>
<stop offset="0.3" style="stop-color:#C74C4D"/>
<stop offset="0.6" style="stop-color:#C21975"/>
<stop offset="1" style="stop-color:#7024C4"/>
</linearGradient>
<circle id="XMLID_83_" style="fill:url(#XMLID_4_);" cx="418.306" cy="134.072" r="34.149"/>
</g>
</svg>
</a>
</div>
`;
// Add content to the content container
content.appendChild(button);
content.appendChild(instructions);
content.appendChild(authorInfo);
// Add content to the card
card.appendChild(tabs);
card.appendChild(content);
// Append the card to the body
document.body.appendChild(card);
// Helper function to set active tab
function setActiveTab(tab) {
activeTab.style.backgroundColor = '#555';
tab.style.backgroundColor = '#777';
activeTab = tab;
updateContent();
}
// Helper function to update content based on active tab
function updateContent() {
button.style.display = (activeTab === tabElements[0]) ? 'block' : 'none';
instructions.style.display = (activeTab === tabElements[1]) ? 'block' : 'none';
authorInfo.style.display = (activeTab === tabElements[2]) ? 'block' : 'none';
}
// Initialize content based on the active tab
updateContent();
})();